core-data - 在重新启动模拟器之前,核心数据托管对象看不到相关对象

标签 core-data ios5 uimanageddocument

有一个树桩(至少对我来说)。

我正在使用带有 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/

相关文章:

core-data - NSPredicate 的 NSFetchedResultsController 未更新

ios - 编辑 UITableViewCell 从 CoreData 提取数据

objective-c - 尝试 segue 时旋转中断

swift - UNIQUE 约束失败 : ZTEMPORADA. Z_PK

ios - 我应该对屏幕上可能发生的一切使用 IBAction 吗?

ios5 - 如何确定当前用户位置是否在我的 MKCoordinateRegion 内?

objective-c - 带有 NSFetchedResultsController 和背景上下文的 UIManagedDocument

ios - 如果我更改文档和数据下的 iCloud 开关,应用程序将停止调试。继续在手机上运行

objective-c - UIManagedDocument 和其他内容

ios - 使用 managedObjectContext 属性保存自定义核心数据对象是否正确