ios - 核心数据多对多关系和数据完整性

标签 ios core-data many-to-many

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

If you have a background in database management and this causes you concern, don't worry: if you use a SQLite store, Core Data automatically creates the intermediate join table for you.

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

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

最佳答案

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

You should typically model relationships in both directions, and specify the inverse relationships appropriately. Core Data uses this information to ensure the consistency of the object graph if a change is made (see “Manipulating Relationships and Object Graph Integrity”). For a discussion of some of the reasons why you might want to not model a relationship in both directions, and some of the problems that might arise if you don’t, see “Unidirectional Relationships.”

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

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

我建议您阅读有关 Efficiently Importing Data 的内容.

希望对您有所帮助。

关于ios - 核心数据多对多关系和数据完整性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10662831/

相关文章:

ios - 在 UITableView 上长按手势

IOS 自定义 Segue 和 ContainerView

ios - 在 Swift 中为完整的 UITableView 创建模糊效果

ios - UITableView 使用 NSFetchedResultsController 和 CoreData 意外反弹到 beginUpdates()/endUpdates()/performBatchUpdates()

ios - 如何在 Swift 中将 NSSet 转换为 NSMutableSet

swift - Swift 中返回多个值的字符串

Django Tastypie,多对多保存错误

php - 使用 WHERE 的多对多(PHP 和 MySQL)

mysql - Node.js mysql 多对多关系

ios - 如何调试锁定的sqlite3数据库