获取后核心数据关系为零

Posted

技术标签:

【中文标题】获取后核心数据关系为零【英文标题】:Core data relationship nil after fetching 【发布时间】:2014-06-26 11:18:27 【问题描述】:

这是Best practice for temporary entities in core data? 的后续问题。我提出了一个新话题,因为我认为这是一个不同的问题。

当我在子上下文中设置我的临时实体时,我会与商店中已经存在的实体建立关系。这可以正常工作,使用 objectID 跨线程传递实体。我使用断点来验证关系是否正常。

现在,当我到达表格以显示所有临时对象(使用NSFetchedResultsController)时,关系为零。临时对象的所有其他属性都已就位,只是关系没有。

所以我肯定在这里遗漏了一些东西。

这是我尝试过的一些代码:

Temp *temp = [NSEntityDescription insertNewObjectForEntityForName: @"Temp" inManagedObjectContext: myImportContext];

NSManagedObjectID *objectID = self.test.objectID;

if (objectID)

    NSError *error = nil;
    Test *t = (Test *)[myImportContext existingObjectWithID:objectID error: &error];

    if (error == nil)
        [temp addTestObject: t];

更新:我忘了补充说这一切都是在后台线程上运行的。

更新 2:我发现了问题所在。 Temp 和 Test 之间的关系是一对多的,所以每次我在 Temp 中添加一个 Test 对象时,它都会删除之前的 Temp 和 Test 之间的关系。将关系设置为多对多解决了它。

【问题讨论】:

据我了解,您的子上下文不会持久保存到数据存储中,直到您调用该上下文的保存并且可能(取决于您的结构)对父上下文的保存。在尝试调用 NSFetchedResultsController 之前,您是否保存了上下文?我也强烈推荐这本书——来自 The Pragmatic Bookshelf——“Core Data, 2nd Edition, Data Storage and Management for ios, OS X, and iCloud”(2013 年 1 月),作者 Marcus S. Zarra。 没错,我的实体是临时的,所以我不会将它们持久化到商店,直到用户想要保存它们。这对于NSFetchedResultsController 来说没有问题,因为我为此使用了子上下文。该表可以很好地加载有关临时实体的所有信息,但关系为零。我有 Zarra 的书和 Tim Roadley 的书。我会继续挖掘。 【参考方案1】:

我发现了问题所在。 Temp 和 Test 之间的关系是一对多的,所以每次我在 Temp 中添加一个 Test 对象时,它都会删除之前的 Temp 和 Test 之间的关系。将关系设置为多对多解决了它。

【讨论】:

以上是关于获取后核心数据关系为零的主要内容,如果未能解决你的问题,请参考以下文章

核心数据一对多关系在获取新对象后失去关系[重复]

MacOS:NSPredicate 查找“一对一”关系不为零的位置

IOS:通过一对多关系获取核心数据

从核心数据获取请求中排除反向关系

核心数据 - 在不触发错误的情况下获取对多关系的 objectID

核心数据多对多关系导致获取的结果控制器崩溃