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

Ios 核心数据多对多关系&;数据完整性,ios,core-data,many-to-many,Ios,Core Data,Many To Many,我处理的是核心数据和多对多关系:一栋建筑可以有多个部门,一个部门可以在多个建筑中。我以前使用过数据库,不确定如何在核心数据中实现这一点,但我在《核心数据编程指南》中发现了这一点: 如果您有数据库管理方面的背景,这会导致 关注点,不要担心:如果使用SQLite存储,核心数据 自动为您创建中间联接表 然而,实际上并不存在任何数据完整性。我已经尝试插入了一些建筑对象,它们目前只有一个属性(编号),每次我设置它所关联的部门对象(关系)。这将导致数据库包含多个具有相同建筑编号的建筑对象,所有对象都与不同的

我处理的是核心数据和多对多关系:一栋建筑可以有多个部门,一个部门可以在多个建筑中。我以前使用过数据库,不确定如何在核心数据中实现这一点,但我在《核心数据编程指南》中发现了这一点:

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

然而,实际上并不存在任何数据完整性。我已经尝试插入了一些建筑对象,它们目前只有一个属性(编号),每次我设置它所关联的部门对象(关系)。这将导致数据库包含多个具有相同建筑编号的建筑对象,所有对象都与不同的部门对象相关。理想情况下,每个建筑编号有一个对象,其中包含位于其中的所有不同部门


所以,我的问题是:核心数据能否以某种方式保持数据的完整性,或者在插入之前是否应该检查具有该编号的建筑对象是否已经存在?看起来我必须手动检查它,但如果Core Data可以为我这样做,那就太酷了。

Core Data为您维护数据完整性。我可以向您保证(根据大量的核心数据经验),您不必手动检查完整性。仔细检查您的关系和删除规则是如何在Xcode的核心数据模型编辑器中设置的。我不能确切地说出你提供的细节可能有什么问题,但如果你仔细看看,你会发现。梅尔萨姆写的是对的。除了他的答案,我建议你使用反向关系。关于反向,苹果表示:

您通常应该在两个方向上对关系进行建模,并且 适当地指定反向关系。核心数据使用这种方法 在发生更改时确保对象图一致性的信息 已创建(请参见“操纵关系和对象图完整性”)。 讨论一下您不想这样做的原因 在两个方向上建立一个关系模型,以及一些 如果不这样做,可能会出现,请参阅“单向关系”

需要理解的一个关键点是,当您使用核心数据时,您使用的是对象。因此,当您保存上下文或明确表示要处理上下文以处理挂起的更改时,完整性标准将得到解决(请参见
processPendingChanges
method)

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

我建议你读一下


希望能有所帮助。

我觉得核心数据模型不错。我有SQL方面的背景,所以我知道什么都可以做。实际上,它每次都插入新对象是有意义的,正如我通过调用
insertNewObjectForEntityForName:inManagedObjectContext:
告诉它的那样。我想我想要核心数据做的是更新记录是否已经存在,如果没有,则插入,但这可能要求太多了。我确实读过苹果的文档,我想直到我写下来并发布它之前,我才意识到我真正想要的是什么。谢谢你们做我的橡皮鸭!