4

我无法让我的 UI 将外部更改(由另一个进程进行)反映到 sqlite 数据存储。

我有一个相当标准的基于核心数据的 NSArrayController / 表格视图。我的应用程序收到通知说数据已进行了外部更改,此时我执行了

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

问题是,这样做会清除表中的所有数据。数组控制器的arrangedObjects 也是空的。我以为后续

[arrayController fetch:nil];

可能有帮助,但它没有。在 managedObjectContext 上执行 fetch 请求显示数据存在并更新,因此 managedObjectContext 知道更改。

关于如何从重置中“恢复”的任何线索?或者重置方法可能完全错误,在这种情况下是否有更好的方法来加载外部更改?

4

2 回答 2

1

我不认为两个进程应该在同一个 Core Data 数据库中工作。让一个进程充当拥有(并打开)数据库的服务器并让另一个进程向它发送命令以进行更改可能会更好。我不认为 Core Data 曾经打算支持多个进程与同一个数据库对话。

于 2010-01-22T12:37:46.700 回答
0

所以我一直在玩这种确切的情况,我不会与第一个答案相矛盾——你可能不应该这样做,如果你必须这样做,也许 iCloud 可以工作。 不要使用此代码。 我提供它是为了帮助其他人发现我没有解决的所有问题,然后继续前进。

也就是说,您可以做最初的问题想要做的事情——强制控制器从磁盘重新加载:

// 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: 是否需要,尽管它可能有助于清除控制器内容中的错误。

I have not been able to get it to restore the tableView selection, though that may be because I do this within a tableview delegate call, so the view's selection gets out of synch with the controller's selection no matter what hacks I try. Maybe this could work for someone, but I suggest trying to figure out how to not allocate a new MOC once your view has bindings to it.

于 2014-04-02T20:26:20.850 回答