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

时间:2012-02-24 19:54:47

标签: core-data ios5 uimanageddocument

有一个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,并保存文档。这些都没有帮助。

任何想法都将不胜感激!

2 个答案:

答案 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];
}

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