0

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

如果您有数据库管理背景并且这引起您的担忧,请不要担心:如果您使用 SQLite 存储,Core Data 会自动为您创建中间连接表。

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

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

4

2 回答 2

1

Core Data 为您维护数据完整性。我可以向您保证(根据 Core Data 的大量经验)您不必手动检查完整性。仔细检查您的关系和删除规则是如何在 Xcode 的核心数据模型编辑器中设置的。我无法确切说明您提供的详细信息可能有什么问题,但是如果您四处寻找,您会发现它。

于 2012-05-19T06:30:17.283 回答
1

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

您通常应该对两个方向的关系进行建模,并适当地指定反向关系。如果进行更改,Core Data 使用此信息来确保对象图的一致性(请参阅“操作关系和对象图完整性”)。有关您可能不想在两个方向上建模关系的一些原因以及如果不这样做可能出现的一些问题的讨论,请参阅“单向关系”。</p>

要理解的一个关键点是,当您使用 Core Data 时,您使用的是对象。因此,当您保存上下文或明确说明要处理的上下文还处理未决更改时,完整性标准就会得到解决(请参阅processPendingChanges方法)。

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

我建议您阅读Efficiently Importing Data

希望能帮助到你。

于 2012-05-19T10:30:08.413 回答