有一个树桩(至少对我来说)。
我正在使用带有 ARC 的 iOS 5.0,以及 UIManagedDocument 中的 Core Data。
我有一个实体(组),与实体(人)具有一对多关系(称为人员)。当我添加一个新组,然后添加一个新人员(将人员的 .group 关系设置为新组)时,我无法使用 Person 实体上的谓词检索相关人员,其中 ("group == %@", myGroup )。我还尝试使用 Group 的 addPerson setter。
如果我关闭 XCode 模拟器并重新运行它,它会识别上次运行中创建的关系,我什至可以将新人员添加到现有的组对象中。我只是无法添加新组,然后在不关闭模拟器(或设备,如果我在设备上运行的话)的情况下添加人员以查看关系。
如果我执行[group.people count],在添加新组和相关人员后立即,它会给出正确的数字。但是,在我重新启动应用程序之前,带有谓词的提取不起作用。
似乎 UIManagedDocument 的 ManagedObjectContext 没有看到这种关系。我尝试过保存上下文、保存 context.parentContext 和保存文档。这些都没有帮助。
任何想法将不胜感激!
最佳答案
UIManagedDocument 基本上会在需要时保存;您无法控制这种情况何时发生。但是,它肯定会节省应用程序终止时间,这就是为什么您在重新启动时会看到插入内容。
因此,虽然您可能认为自己拥有永久对象 ID,但它们实际上可能是临时的,因此无法获取。只需通过 NSLog 转储它们即可验证这一点,因为临时对象 ID 在记录时会显示出来。
要强制它们永久可用,请在执行添加后尝试以下操作。假设您有一个 UIManagedDocument 作为 ivar:
- (void)performUpdate
{
NSManagedObjectContext * context = self.managedDocument.managedObjectContext;
NSSet * inserts = [context insertedObjects];
if ([inserts count])
{
NSError * error = nil;
if ([context obtainPermanentIDsForObjects:[inserts allObjects]
error:&error] == NO)
{
NSLog(@"BAM! %@", error);
}
}
[self.managedDocument updateChangeCount:UIDocumentChangeDone];
}
显然,您可以用更好的东西来替换错误处理。 UIManagedDocument 现在将在将来的某个时刻保存(同样,您完全无法控制何时发生,我们只是要求它在最后一行执行此操作,就像撤消管理器一样) ,但新插入的对象现在应该具有可用的永久 ID,并且提取应该可以正常工作。
是的,这对我来说也有点奇怪,但这似乎是使用 UIManagedDocument 进行操作的正确方法。
坦率地说,我希望有人告诉我我错了并提供更好的解决方案。
关于core-data - 在重新启动模拟器之前,核心数据托管对象看不到相关对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9437159/