9

長いタイトルを残して申し訳ありません。NSFetchedResultController機能を維持しながら、単一のCoreDataエンティティ(コンテキスト全体ではない)を保存します。

私は2つの異なる場所から派生した曲を格納している単一のマネージオブジェクトコンテキストを持っています。私はコアデータを使用して電話の永続ストレージから曲の一部を取得し、オンラインデータベースから曲の一部を取り出す。両方の曲は、同じMananagedObjectサブクラスのものです。 NSFetchedResultsControllerに接続されたテーブルビューに両方を表示したいので、両方の曲を単一のコンテキストにすることをお勧めします。

問題は、曲の1つを保存したいときに発生します。私は、私がオンラインデータベースから取り出したすべての曲を電話に保存したくありません。私はちょうど単一の曲を保存したいので、単純な[モックセーブ]は動作しません。もう一つの問題は、私が単一の曲を保存した後で、私はまだオンラインから引き出された曲が文脈にあることを望んでいるということです。

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

2)オンラインデータベースから取り出したすべての曲を別の一時的なコンテキストに移動し、元のコンテキストで保存してから、すべての曲を元に戻すことができました。 (How do I copy or move an NSManagedObject from one context to another?を参照)

3)オンラインソングのすべてのキーと値のペアを覚えておいて、コンテキストからオンラインソングを削除し、元のコンテキストを保存して元のコンテキストに元のコンテキストに戻します保存されたキーと値のペアの

4)私は巨大なn00bで、何かが簡単に欠けています。

ありがとうございます!

+0

実際に何を保存しますか?曲の位置または実際の曲データ(ファイル)? – sosborn

答えて

8

あなたの永続的なストアコーディネーターにはNSPersistentStoreが追加されているのが一番簡単なことです。そのストアをメモリ内のストアにし、すべての "オンライン"結果をその(一時的な)ストアに格納することができます。新しく挿入したオブジェクトを保存するストアを指定するには、assignObject:toPersistentStore:を使用します。これを済ませたら、「保存」はオンラインソングの記憶にのみ起こるため、自由に保存することができます。

次に、オンラインセットからパーマネントセットにソングを移動したい場合は、それを削除して再度挿入し、新しいオブジェクトを同じ方法で永続的な永続ストアに割り当てます。

これにより、NSPersistentStoreCoordinatorに添付されたNSManagedObjectContextが1つ使用され、NSPersistentStoreの両方のオブジェクトが表示されます。

+0

Appleは、同様のシナリオ(アプリに付属の缶詰のスターターデータなど)に複数の永続ストアを使用することを促進しています。永続的なストレージプランが異なるエンティティがあるときはいつでも良いアイデアだと思います。 – rickster

+0

素晴らしい答え。私の質問に対する答えがオプション#4だったと思ってください... – rizzes

+1

異なる永続ストアを使用しているエンティティ間の関係を維持している場合は注意が必要です。 Appleの友人によれば、「ある永続ストア内のインスタンスから別の永続ストア内のインスタンスへのリレーションシップを作成しないよう注意する必要があります。これは、Core Dataではサポートされていないためです。異なるストア内のエンティティ間のリレーションシップを作成する必要がある場合通常、フェッチされたプロパティを使用します。 "https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html#//apple_ref/doc/uid/TP40001857-SW5 – NSTJ

5

Jesseのソリューションは正常に動作します。

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

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

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

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

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

一時アイテムを削除する準備ができたら、tempContextをnilに設定します。

関連する問題