获取后核心数据关系为零
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 查找“一对一”关系不为零的位置