Core Data は初めてです。コレクション型は属性型として使用できないことに気付きました。配列/辞書型のデータを属性として格納する最も効率的な方法を知りたいです (たとえば、通り、都市などの住所を構成する要素は、.個別のエンティティを必要とせず、個別の属性/フィールドよりも辞書/配列として保存する方が便利です)。ありがとうございました。
2 に答える
CoreDataには「ネイティブ」配列またはディクショナリタイプはありません。NSArray
またはNSDictionary
を変換可能な属性として保存できます。これは、を使用しNSCoding
て配列またはディクショナリをNSData
属性にシリアル化します(アクセス時に適切に逆シリアル化します)。このアプローチの利点は、簡単なことです。欠点は、配列またはディクショナリ(データストアにBLOBとして格納されている)にクエリを実行できないことです。コレクションが大きい場合は、データストアとの間で大量のデータを移動する必要があります(データストアの場合)。コレクションのごく一部を読み取ったり変更したりするためのSQLiteデータストア)。
別の方法は、コアデータと多くの関係を使用して、配列またはディクショナリコレクションのセマンティクスをモデル化することです。配列の方が簡単なので、それから始めましょう。Core Dataと多くの関係は実際にセットをモデル化しているため、配列のような機能が必要な場合は、セットを並べ替えるか(フェッチされたプロパティを使用すると便利です)、エンティティにインデックス属性を追加する必要があります配列アイテムを格納し、インデックスを自分で管理します。同種の配列を格納している場合(すべてのエントリが同じタイプ)、配列エンティティのエンティティ記述を簡単にモデル化できます。そうでない場合は、変換可能な属性を使用してアイテムデータを保存するか、アイテムエンティティのファミリーを作成するかを決定する必要があります。
ディクショナリのモデリングには、キーと値を格納する一連のエンティティとの多対多の関係が必要になる可能性があります。キーと値はどちらも、上記の配列のアイテムエンティティに類似しています。したがって、それらはネイティブタイプ(事前に知っている場合)、変換可能な属性、またはタイプ固有のエンティティのファミリーからのインスタンスへの関係のいずれかである可能性があります。
これがすべて少し気が遠くなるように聞こえるなら、それはそうです。CoreDataのようなスキーマ依存のフレームワークに任意のデータをシューホーニングするのは困難です。
アドレスなどの構造化データの場合、ほとんどの場合、エンティティを明示的にモデル化することに時間を費やす方が簡単です(たとえば、アドレスの各部分の属性)。辞書をモデル化するための余分なコードをすべて回避することに加えて、これによりUIが簡単になり(バインディングは「正しく機能」します)、検証ロジックなどの多くがCoreDataで処理できるためより明確になります。
アップデート
OS X 10.7以降、Core Dataには、配列の代わりに使用できる順序集合タイプが含まれています。10.7以降をターゲットにできる場合、これは順序付けられた(配列のような)コレクションに最適なソリューションです。
同様の問題がありました。私の場合、文字列の配列をマップしたかったのです。私はバリーのアドバイスに従い、ついにそれを機能させました。コードの一部は次のようになります (うまくいけば、これに遭遇した他の人のために物事を明確にすることができます)...
私のエンティティは次のようになります。
@interface AppointmentSearchResponse : NSManagedObject
@property (nonatomic, retain) NSSet *messages;
@end
私の Manage Object Model Code (Core Data) コードは次のようになります。
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];
したがって、ここでの重要な項目は次のとおりです。
- プロパティタイプに NSSet を使用しています
- Core Data Managed Object Model の属性タイプとして NSTransformableAttributeType を使用しています。