42

序章

私の iOS プロジェクトには、SQLite 形式で約 160 MB の Core Data 永続ストアが付属しています。そこには大量のグループ化された情報があり、ユーザーはお気に入りをマークできるはずです。このためには、データベース (少なくともその一部) に書き込み機能が必要です。ただし、もちろん、アプリケーション バンドルに同梱される永続ストアは、設計上読み取り専用です。

ストアに読み書き機能を持たせたい場合は、アプリのドキュメント フォルダなどにコピーする必要があります。データベースの主要部分はとにかく読み取り専用ですが、アプリのサイズが2倍になるため、これを行いたくありません。それはリソースの浪費になります。

NSPersistentStoreCoordinator の複数の永続ストア

これが、2 つの永続ストアを使用することを考えた理由です。1 つ目はバンドル内の大きなもので、2 つ目はドキュメント フォルダー内の小さなもので、大きなストアとの関係を持つ特別な "お気に入り" エンティティを格納します。

この点で何かが可能であることは知っていますが、詳細を見つけることができません。オブジェクト モデルも複数ある場合は、複数のストアのみを使用する必要がありますか? 1 つのオブジェクト モデルを 2 つの永続ストアに「分散」できますか? Core Data Programming docsを参照すると、これを設定する方法に関する実際の参照が見つかりません。また、マーカス・ザラの本は、このトピックを掘り下げていないようです:

NSPersistentStoreCoordinator に複数の NSPersistentStore を追加することができます。これは、複数のファイルに分割されたデータを処理する場合に役立ちます。ただし、この例では、単一のファイルがあります。( Marcus Zarra: 「コア データ - Mac OS X でデータを永続化するための Apple の API」71 ページ)

質問

私が考えていることが Core Data と複数の永続ストアで可能かどうか誰が教えてくれますか? そして、これを達成する方法についてのヒントを提供できますか? このトピックを扱うオンライン/オフラインのリソースも非常に高く評価されています.

4

3 に答える 3

47

答えはイエスです。@Caleb は適切なリソースを指していますが、それを機能させるのはまだかなり厄介です。私はここに履歴書を置くと思った:

2 つのNSPersistentStoreインスタンスが同じモデルを共有するには、構成をモデルに追加する必要があります。これは、エンティティの文字列名のサブセットです。

モデル構成

このモデルでは、2 番目のストアに属するエンティティに、フェッチされたプロパティを追加します (NSFetchedPropertyDescriptionググるため)。これは非常に単純なストアド プロシージャで、次のようになります。

取得したプロパティの NSPredicate 形式

次に、ストアを永続ストア コーディネーターに追加するときに、configuration引数に文字列を使用します (オプションの詳細については、こちらを参照してください)。

[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
                                          configuration:@"ModifyInBackground" 
                                                    URL:storeURL1
                                                options:options
                                                  error:&error]

[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
                                          configuration:@"ModifyInMain"
                                                    URL:storeURL2 
                                                options:options 
                                                  error:&error]

最後に、ストア B のエンティティからストア A のエンティティに移動する場合は、フェッチされたプロパティにアクセスするだけで、障害をトリガーするのと同じように、フェッチされたプロパティをトリガーします。

注:フェッチされたプロパティは、常に NSArray を返します。これは、リンクを確立するために記述した述語が複数の結果を持つ可能性があるためです。NSManagedObject1 つのエンティティだけを取得する場合は、サブクラスのラッパー メソッドに次のようなものを配置できます。

Wallpaper *recordedWallpaper = [record.wallpaper lastObject];
于 2012-11-17T23:26:24.873 に答える
1

1 つの考え: 異なるストアをまとめて作成し、ストアごとに異なる永続ストア コーディネーターを作成することもできます。次に、モデル パーツごとに異なる管理オブジェクト コンテキストを作成します。たとえば、学生、大学、およびコースの 3 つのエンティティを持つモデルがあるとします。Student エンティティと College エンティティを store1 に格納し、Course を Store2 に格納するとします。2 セットの managedObjectContext、永続ストア、および永続コーディネーターが必要です。クロス ストア リレーションシップを持つことはできないため、あるコンテキストでの変更は別のコンテキストに影響しません。さまざまなモデルを作成したり、ストアに関連付けたりする必要はありません。

于 2011-04-13T09:01:20.687 に答える