核心数据,关系消失
Posted
技术标签:
【中文标题】核心数据,关系消失【英文标题】:Core-data, relationship disappearing 【发布时间】:2014-12-05 13:38:45 【问题描述】:我在数据库中有两个实体,类别和子类别。类别可以有多个子类别。关系定义如下:
Category->Subcategories(to-many, has inverse, cascade)
Subcategory->Category(to-one, has inverse, nullify)
一切正常,但有时 Category->Subcategories 关系为空,而 Subcategory->Category 正常,这很奇怪。这种情况很少发生,我无法找出原因。
以下是来自控制台的日志,其中可以看到类别实例具有空的子类别关系,但数据库中的子类别之一与其关系具有相同的类别实例。
我不明白关系的一端是空的还是好的,因为当设置任一端时它们会自动连接。
Category: 0x7b6f8020> (entity: Category; id: 0x7b6f6d40 x-coredata://021C3D9A-7A0C-4326-B526-9E9253611C44/Category/p8> ; data:
… other data
subcategories = (
);
)
Subcategory: 0x7c8f7770> (entity: Subcategory; id: 0x7c8c91b0 x-coredata://021C3D9A-7A0C-4326-B526-9E9253611C44/Subcategory/p5> ; data:
… other data
category = "0x7b6f6d40 x-coredata://021C3D9A-7A0C-4326-B526-9E9253611C44/Category/p8>";
)
【问题讨论】:
很奇怪。也许在 XCode 中添加数据模型的屏幕截图,以便我们帮助查找设置不正确的内容? 这两个对象是否来自同一个托管对象上下文? 是的,这两个对象来自同一个 MOC。数据模型没问题,否则根本行不通。我发现一段代码改变了“performblock”之外的子类别实体中的某些属性,这可能是原因吗?这种情况一个月发生两次,所以很难调试,上次发生这种情况我保存了一个数据库文件但仍然无法弄清楚。 【参考方案1】:你使用refreshObject:mergeChanges:
吗?该文档似乎表明这可能会导致诸如您的问题:
您可以使用 refreshObject:mergeChanges: 方法将已实现的对象变为故障。如果您将 NO 作为 mergeChanges 参数传递,则必须确保该对象的关系没有更改。如果有,然后保存上下文,就会给持久存储引入参照完整性问题。
请参阅 Apple 文档 here。
【讨论】:
我不在代码中的任何地方使用 refreshObject:mergeChanges:。 你使用原始访问器吗?还是直接修改Category.Subcategories NSSet?以上是关于核心数据,关系消失的主要内容,如果未能解决你的问题,请参考以下文章
使用 NSFetchedResultsController 和核心数据移动时 UITableView 单元格消失