在重新启动Simulator之前,Core Data托管对象不会看到相关对象

Byr*_*ron 7 core-data ios5 uimanageddocument

有一个Stumper(至少对我来说).

我在UIManagedDocument中使用iOS 5.0 w/ARC和Core Data.

我有一个Entity(Group),它与to-many关系(称为people)到实体(Person).当我添加一个新组,然后添加一个新Person(将该人的.group关系设置为新组)时,我无法使用Person实体中的谓词检索相关人员("group ==%@",myGroup ).我也尝试使用Group的addPerson setter.

如果我关闭XCode模拟器并重新运行它,它会识别在上一次运行中创建的关系,我甚至可以将新人添加到现有的Group对象中.我只是无法添加一个新组,然后添加人员而不关闭模拟器(或设备,如果我在设备上运行),以便看到关系.

如果我在添加新组和相关人员后立即执行[group.people count],它会给我正确的数字.但是,在重新启动应用程序之前,使用谓词进行提取无效.

看起来好像UIManagedDocument的managedObjectContext没有看到关系.我已经尝试保存上下文,保存context.parentContext,并保存文档.这些都没有帮助.

任何想法,将不胜感激!

All*_*net 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];
}
Run Code Online (Sandbox Code Playgroud)

显然,你可以在这里用更好的东西替换错误处理.UIManagedDocument现在将在未来的某个时刻保存(再次,你完全无法控制何时发生这种情况,我们只是要求它在最后一行中这样做,就像撤消管理器一样) ,但新插入的对象现在应该有可用的永久ID,并且提取应该正常工作.

是的,这对我来说似乎有点奇怪,但这似乎是使用UIManagedDocument进行游戏的正确方法.

坦率地说,我喜欢有人告诉我我错了,并提供更好的解决方案.