7

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

我正在使用带有 ARC 的 iOS 5.0 和 UIManagedDocument 中的核心数据。

我有一个实体(组)与实体(人)有一对多关系(称为人)。当我添加一个新组,然后添加一个新人员(将人员的 .group 关系设置为新组)时,我无法使用 Person 实体上的谓词检索相关人员 where ("group == %@", myGroup )。我还尝试使用 Group 的 addPerson 设置器。

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

如果我做一个 [group.people count],在添加新组和相关人员之后立即给我正确的数字。但是在我重新启动应用程序之前,带有谓词的提取不起作用。

似乎 UIManagedDocument 的 managedObjectContext 没有看到这种关系。我试过保存上下文、保存 context.parentContext 和保存文档。这些都没有帮助。

任何想法,将不胜感激!

4

2 回答 2

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,并且 fetch 应该可以正常工作。

是的,这对我来说也有点奇怪,但这似乎是使用 UIManagedDocument 做事的正确方法。

坦率地说,我希望有人告诉我我不正确并提供更好的解决方案。

于 2012-02-26T07:47:53.903 回答
-1

我遇到了类似的问题,执行更新对我没有帮助。这做到了:

NSArray *insertedObjs = [[self.managedObjectContext insertedObjects] allObjects];
if ([insertedObjs count] > 0) {
    NSError * error;
    [self.managedObjectContext obtainPermanentIDsForObjects:insertedObjs error:&error];
}

我在插入对象之后和保存之前运行它。

于 2012-05-09T00:59:32.747 回答