核心数据多对多关系&数据的完整性

时间:2012-05-19 06:18:09

标签: ios core-data many-to-many

我正在使用Core Data和多对多关系:一个建筑可以有多个部门,一个部门可以在多个建筑物中。以前使用过数据库之后,我不确定如何在Core Data中实现它,但我在核心数据编程指南中找到了这个:

  

如果你有数据库管理的背景,这会导致你   关注,不要担心:如果你使用SQLite商店,核心数据   自动为您创建中间联接表。

然而,实际上没有任何数据完整性。我已经尝试插入一些构建对象,现在只有一个属性(数字),每次我设置它所涉及的部门对象(关系)。这导致数据库包含具有相同建筑物编号的多个建筑物对象,所有这些都与不同的部门对象相关。理想情况下,每个建筑物编号都有一个对象,其中包含所有不同的部门。

所以,我的问题是:Core Data能否以某种方式维护数据完整性,或者我应该在插入之前检查具有该数字的构建对象是否已存在?看起来我必须手动检查它,但如果Core Data可以为我做这件事会很酷。

2 个答案:

答案 0 :(得分:1)

核心数据可为您维护数据完整性。我可以向您保证(从核心数据的大量经验),您不必手动检查完整性。仔细检查如何在Xcode的核心数据模型编辑器中设置关系和删除规则。我不清楚你提供的细节究竟出了什么问题,但如果你四处寻找,你会发现它。

答案 1 :(得分:1)

melsam 写的是对的。除了他的回答,我建议你使用反向关系。关于逆,Apple说:

  

您通常应该在两个方向上建模关系,并且   适当地指定反向关系。核心数据使用此功能   信息,以确保更改时对象图的一致性   制作(参见“操纵关系和对象图完整性”)。   有关您可能不想要的一些原因的讨论   模拟两个方向的关系,以及一些问题   如果不这样做可能会出现,请参阅“单向关系”。

要理解的一个关键点是,当您使用Core Data时,您将使用对象。因此,保存上下文时会解析完整性标准,或者您明确表示上下文处理还处理挂起的更改(请参阅processPendingChanges方法)。

关于你的问题,我想你必须创建一个获取请求并检索你正在寻找的对象(例如,你可以为每个对象提供一个特定的id并设置一个你想要的id的谓词)。 如果获取请求检索某些对象,则可以更新它们。如果没有,请使用insertNewObjectForEntityForName:inManagedObjectContext:创建一个新对象。最后保存上下文。

我建议你阅读Efficiently Importing Data

希望它有所帮助。