web-dev-qa-db-ja.com

ベストプラクティス? -コアデータエンティティ属性としての配列/辞書

Core Dataは初めてです。コレクション型は属性型として利用できないことに気づきました。配列/辞書型データを属性として保存する最も効率的な方法は何かを知りたいと思っています個別のエンティティを必要とせず、個別の属性/フィールドよりも辞書/配列としてより便利に保存されます)。ありがとうございました。

174
RunLoop

Core Dataには「ネイティブ」配列または辞書タイプはありません。 NSArrayまたはNSDictionaryを変換可能な属性として保存できます。これは、NSCodingを使用して、配列または辞書をNSData属性にシリアル化します(アクセス時に適切に逆シリアル化します)。このアプローチの利点は、簡単なことです。欠点は、配列または辞書にクエリを実行できないことです(データストアにBLOBとして格納されます)。コレクションが大きい場合は、データストアとの間で大量のデータを移動する必要があります(データストアにある場合)コレクションのごく一部を読み取りまたは変更するためのSQLiteデータストア)。

別の方法は、Core Dataの多対多の関係を使用して、配列または辞書コレクションのセマンティクスをモデル化することです。配列は簡単なので、それから始めましょう。コアデータの多対多リレーションシップは実際にセットをモデル化しているため、配列のような機能が必要な場合は、セットを並べ替える(フェッチされたプロパティを使用すると便利です)か、エンティティに追加のインデックス属性を追加する必要があります配列項目を保存し、自分でインデックスを管理します。同種の配列(すべてのエントリが同じタイプ)を格納している場合、配列エンティティのエンティティ記述をモデル化するのは簡単です。そうでない場合は、変換可能な属性を使用してアイテムデータを保存するか、アイテムエンティティのファミリーを作成するかを決定する必要があります。

辞書のモデル化には、キーと値を格納するエンティティのセットとの多対多の関係が必要になる可能性があります。キーと値の両方は、上記の配列のアイテムエンティティに類似しています。したがって、それらはネイティブ型(事前に知っている場合)、変換可能な属性、または型固有のエンティティのファミリーからのインスタンスとの関係のいずれかです。

これが少し気が遠くなるように聞こえる場合は、そうです。 Core Dataのようなスキーマ依存フレームワークに任意のデータをシューホーンするのは困難です。

住所などの構造化データの場合、エンティティを明示的にモデル化するのに時間を費やす方がほとんど常に簡単です(たとえば、住所の各部分の属性)。辞書をモデル化するための余分なコードをすべて回避することに加えて、これによりUIがより簡単になり(バインディングが「機能する」)、検証ロジックなどがより明確になります。

更新

OS X 10.7の時点で、Core Dataには配列の代わりに使用できる順序付きセットタイプが含まれています。 10.7以降をターゲットにできる場合、これは順序付けられた(配列のような)コレクションに最適なソリューションです。

244
Barry Wark

同様の問題がありました。私の場合、文字列の配列をマップしたかった。私はバリーのアドバイスに従い、ついに機能させました。コードの一部は次のようになります(これに遭遇した他の人のために物事を明確にすることを願っています)...

私のエンティティは次のようになります。

@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];

そのため、重要な項目は次のとおりです。

  • プロパティタイプにNSSetを使用しています
  • Core Data Managed Object Modelの属性タイプとしてNSTransformableAttributeTypeを使用しています。
11
caleb