有一个Stumper(至少对我而言)。
我在UIManagedDocument中使用iOS 5.0 w / ARC和Core Data。
我有一个与实体(Person)有多对多关系(称为人)的实体(组)。当我添加一个新组,然后添加一个新Person(将该人的.group关系设置为新组)时,我无法使用Person实体中的谓词检索相关人员(“group ==%@”,myGroup )。我也尝试使用Group的addPerson setter。
如果我关闭XCode模拟器并重新运行它,它会识别在上一次运行中创建的关系,我甚至可以将新人添加到现有的Group对象中。我只是无法添加一个新组,然后添加人员而不关闭模拟器(或设备,如果我在设备上运行),以便查看关系。
如果我在添加新组和相关人员后立即执行[group.people count],它会给我正确的数字。但是,在重新启动应用程序之前,使用谓词进行提取无效。
似乎UIManagedDocument的managedObjectContext没有看到关系。我已经尝试保存上下文,保存context.parentContext,并保存文档。这些都没有帮助。
任何想法都将不胜感激!
答案 0 :(得分:10)
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的方法。
坦率地说,我喜欢有人告诉我我错了,并提供更好的解决方案。答案 1 :(得分:-1)
我遇到了类似的问题,执行更新对我没有帮助。这样做了:
NSArray *insertedObjs = [[self.managedObjectContext insertedObjects] allObjects];
if ([insertedObjs count] > 0) {
NSError * error;
[self.managedObjectContext obtainPermanentIDsForObjects:insertedObjs error:&error];
}
我在插入对象之后和保存之前运行它。