回答:
Core Dataには「ネイティブ」の配列または辞書タイプはありません。NSArray
またはをNSDictionary
変換可能な属性として保存できます。これはを使用しNSCoding
て、配列またはディクショナリをNSData
属性にシリアル化します(アクセス時に適切に逆シリアル化します)。このアプローチの利点は、簡単であることです。欠点は、配列または辞書(データストアにBLOBとして格納されている)にクエリを実行できないことと、コレクションが大きい場合、大量のデータをデータストアとの間で移動する必要がある場合があります(データストアの場合) SQLiteデータストア)を使用して、コレクションのごく一部を読み取るか変更します。
代わりの方法は、Core Dataの多対多の関係を使用して、配列または辞書コレクションのセマンティクスをモデル化することです。配列の方が簡単なので、それから始めましょう。コアデータと多対多の関係は実際にセットをモデル化しているため、配列のような機能が必要な場合は、セットを並べ替える(フェッチしたプロパティを使用すると、これを行うのに便利な方法です)か、エンティティに追加のインデックス属性を追加する必要があります配列項目を格納し、インデックスを自分で管理します。同種の配列(すべてのエントリが同じ型)を格納している場合、配列エンティティのエンティティの説明を簡単にモデル化できます。そうでない場合は、変換可能な属性を使用してアイテムデータを格納するか、アイテムエンティティのファミリを作成するかを決定する必要があります。
辞書のモデリングでは、キーと値を格納するエンティティのセットとの多対多の関係が必要になる可能性があります。キーと値はどちらも、上記の配列のアイテムエンティティに類似しています。したがって、それらはネイティブタイプ(事前に知っている場合)、変換可能な属性、またはタイプ固有のエンティティのファミリーからのインスタンスへの関係のいずれかになります。
このすべてが少し困難に聞こえる場合は、そうです。Core Dataのようなスキーマ依存のフレームワークに任意のデータを靴べらするのは難しいです。
住所などの構造化データの場合、エンティティを明示的にモデル化することに時間を費やす方が簡単です(例:住所の各部分の属性)。ディクショナリをモデル化するためのすべての追加コードを回避することに加えて、これにより、UIがより簡単になり(バインディングは「機能するだけ」)、検証ロジックなどがCore Dataで処理できるため、より明確になります。
更新
OS X 10.7以降、Core Dataには、配列の代わりに使用できる順序付きセットタイプが含まれています。10.7以降をターゲットにできる場合、これは順序付けられた(配列のような)コレクションの最良のソリューションです。
同様の問題がありました。私の場合、文字列の配列をマップしたいと思いました。私はバリーのアドバイスに従い、ついにそれを機能させました。これは、一部のコードの外観です(これにより、他の人がこの問題に遭遇した場合にうまく理解できるようになります)...
私のエンティティは次のようになります:
@interface AppointmentSearchResponse : NSManagedObject
@property (nonatomic, retain) NSSet *messages;
@end
オブジェクトモデルの管理コード(コアデータ)のコードは次のようになります。
NSEntityDescription *entityDescription = [[NSEntityDescription alloc] init];
[entityDescription setName:@"AppointmentSearchResponse"];
[entityDescription setManagedObjectClassName:@"AppointmentSearchResponse"];
NSMutableArray *appointmentSearchResponseProperties = [NSMutableArray array];
NSAttributeDescription *messageType = [[NSAttributeDescription alloc] init];
[messageType setName:@"messages"];
[messageType setAttributeType:NSTransformableAttributeType];
[appointmentSearchResponseProperties addObject:messageType];
[entityDescription setProperties:appointmentSearchResponseProperties];
したがって、ここでの重要な項目は次のとおりです。