4

UI に (別のプロセスによって行われた) 外部の変更を sqlite データ ストアに反映させるのに問題があります。

私はかなり標準的なコア データ ベースの NSArrayController / テーブル ビューを持っています。私のアプリは、データに外部変更が加えられたという通知を受け取ります。

[managedObjectContext reset]; // brute force, but data set is small

問題は、これを行うとテーブルからすべてのデータが消去されることです。配列コントローラの ArrangeObjects も空です。その後のことを考えた

[arrayController fetch:nil];

役立つかもしれませんが、そうではありません。managedObjectContext でフェッチ要求を実行すると、データが存在し、更新されていることが示されるため、managedObjectContext は変更を認識します。

リセットから「回復」する方法についての手がかりはありますか? または、リセットのアプローチが完全に間違っている可能性があります。その場合、外部の変更をロードするためのより良い方法はありますか?

4

2 に答える 2

1

2 つのプロセスが同じ Core Data データベースで動作することはないと思います。1 つのプロセスをデータベースを所有する (そして開く) サーバーとして機能させ、もう一方のプロセスにコマンドを送信させて変更を加える方がよいでしょう。Core Data が、同じデータベースと通信する複数のプロセスをサポートすることを意図していたとは思いません。

于 2010-01-22T12:37:46.700 に答える
0

したがって、私はこの正確な状況をいじっていますが、最初の答えと矛盾するつもりはありません.おそらくこれを行うべきではありません. このコードは使用しないでください。 私が修正しなかったすべての問題を他の人が発見し、次に進むことができるようにするために、私はそれを提供します。

そうは言っても、元の質問がしようとしていたことを行うことができます-コントローラーを強制的にディスクからリロードします:

// Tear down bindings and context, create new context & rebind
[self.watcherAC unbind:@"managedObjectContext"];
[self saveAction:self]; // Optional, dependent on NSMergePolicy, etc
self.managedObjectContext = [[NSManagedObjectContext alloc] init];
self.managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy;
[self.managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
[self.watcherAC bind:@"managedObjectContext" toObject:self withKeyPath:@"managedObjectContext" options:nil];

// Force controller to refetch and rearrange
NSError* error;
[self.watcherAC fetchWithRequest:nil merge:NO error:&error];  // Immediate fetch
[self.watcherAC prepareContent];
[self.watcherAC rearrangeObjects];

これにより、ディスク上のストアから tableView のコンテンツが更新されます。(tableView は watcherAC 配列コントローラーにバインドされています)

fetch: は即時ではないことがわかりました。アプリケーションの実行ループを介して次回実行されます。したがって、フェッチ/再配置を正しい順序で行うには、fetchWithRequest を使用する必要があります。

prepareContent: が必要かどうかはわかりませんが、コントローラーのコンテンツの障害を解決するのに役立つ可能性があります。

tableviewデリゲート呼び出し内でこれを行うためかもしれませんが、tableViewの選択を復元することはできませんでした。 これは誰かにとってはうまくいくかもしれませんが、ビューがバインドされたら新しいMOCを割り当てない方法を見つけようとすることをお勧めします。

于 2014-04-02T20:26:20.850 に答える