2012-05-19 98 views
0

我正在使用Core Data和多对多关系:建筑物可以有多个部门,部门可以位于多个建筑物中。之前,数据库工作过,我不确定如何实现这个核心数据,但我发现这个核心数据编程指南:核心数据多对多关系和数据完整性

如果在数据库管理后台,这使你 关注,不要担心:如果您使用SQLite存储,Core Data 会自动为您创建中间连接表。

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

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

回答

1

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

您通常应该在两个方向建模关系,并且 指定适当的反关系。核心数据使用此 信息来确保对象图的一致性(如果发生更改 )(请参阅“处理关系和对象图完整性”)。 对于如果你不这样做,看到 可能出现的一些原因你可能想不 模式在两个方向上的关系的原因,和一些问题的讨论“单向关系。”

需要了解的一个关键点是,当您使用Core Data时,您可以使用对象。因此,完整性标准可以在保存上下文时解决,也可以在上下文中对上下文进行处理以处理待处理的更改(请参阅processPendingChanges方法)。

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

我建议您阅读关于Efficiently Importing Data

希望它有帮助。

+0

我确实读过苹果文档,我想我没有意识到我真正想要什么,直到我写下来并发布。感谢您成为我的橡皮鸭家伙! –

1

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

+0

核心数据模型对我来说很好。我有一个SQL背景,所以我知道一切。它确实有道理,它每次都插入新的对象,因为我通过调用'insertNewObjectForEntityForName:inManagedObjectContext:'告诉它。我想我想让Core Data做的事情是更新,如果记录已经存在,并插入,如果它没有,但这可能太多问。 –