gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:51:12 26 4
gpt4 key购买 nike

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com