9

ふぅ、長いタイトルでごめんなさい。

2つの異なる場所から派生した曲を保存している単一の管理対象オブジェクトコンテキストがあります。電話の永続ストレージから(Core Dataを使用して)曲の一部を取得し、オンラインデータベースから曲の一部を取得します。両方の曲は同じMananagedObjectサブクラスです。NSFetchedResultsControllerに接続されたテーブルビューに両方を表示したいので、これらの曲の両方を単一のコンテキストにしたいと思います。

曲の1つを保存したいときに問題が発生します。オンラインデータベースから取得したすべての曲を電話に保存したくありません。1曲だけ保存したいので、単純な[mocsave]では動作しません。もう1つの問題は、1つの曲を保存した後でも、オンラインから取得した曲をコンテキスト内に配置したいということです(ただし、ここでも保存されません)。私にはいくつかの異なる選択肢があると思います:

1)NSFetchedResultsコントローラーを複数のコンテキストに接続することは可能ですか?

2)オンラインデータベースから取得したすべての曲を別の一時的なコンテキストに移動し、元のコンテキストに保存してから、すべての曲を元に戻すことができます。(参照:NSManagedObjectをあるコンテキストから別のコンテキストにコピーまたは移動するにはどうすればよいですか?

3)オンライン曲のすべてのキーと値のペアを覚えて、コンテキストからオンラインの曲を削除し、元のコンテキストを保存し、保存されたキーと値のペアに基づいてすべてのオンライン曲を元のコンテキストに挿入し直します。

4)私は巨大なn00bであり、もっと簡単なものが欠けています。

ありがとう!

4

2 に答える 2

8

NSPersistentStore最も簡単な方法は、永続的なストアコーディネーターに2人目を接続することだと思います。そのストアをメモリ内ストアにして、すべての「オンライン」結果をその(一時的な)ストアに保存することができます。新しく挿入したオブジェクトを保存するストアを指定できますassignObject:toPersistentStore:。これを実行すると、「保存」はオンライン曲のメモリにのみ発生するため、自由に保存できます。

次に、曲をオンラインセットからパーマネントセットに移動する場合は、曲を削除して再度挿入し、同じ方法で新しいオブジェクトをパーマネントパーシステントストアに割り当てます。

NSManagedObjectContextこれにより、に接続されたシングルを使用できるようにNSPersistentStoreCoordinatorなり、両方のオブジェクトが表示されますNSPersistentStore

于 2012-08-08T00:56:12.787 に答える
5

Jesseのソリューションは問題なく機能します。

ただし、別のオプションとして、詳細なインスペクターの場合と同じように、ネストされたコンテキストを使用することができます。

そのコンテキストはすべての「一時的な」アイテムを保持できますが、「保存」コンテキストの子であるため、すべてのフェッチは問題なく機能します。

NSManagedContext *tempContext = [[NSManagedContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
tempContext.parentContext = mainManagedObjectContext;

すべての保存はmainManagedObjectContextに挿入され、save:で保存されます。すべての一時的なアイテムはtempContextに入ります。

フェッチした結果コントローラーもtempContextに接続します。

一時的なアイテムを取り除く準備ができたら、tempContextをnilに設定するだけです。

于 2012-08-08T02:28:30.820 に答える