0

Core Data 中的关系只是让我感到困惑。我读了又读,但我就是不明白。我想我通常在阅读时感到沮丧并没有帮助。我想做一些非常简单的事情:

我有一个名为的实体Pictures和一个名为User. 我希望用户能够喜欢和标记图片中的其他人,因此每个Picture实体都有两种关系:

图片实体:

UsersWhoLikedThePicture (to-many):

Destination: User 
Inverse: Picture

UsersWhoAreTaggedInThePicture(对多):

Destination: User
Inverse: Picture

但这在使用中造成了如此多的混淆,我什至无法开始描述。这是不一致的。有人喜欢一张图片会导致他们作为标记用户被删除,喜欢一张图片会导致您对所有其他图片的喜欢被删除。啊,真是一团糟……我的结构看起来还好吗?我将如何建模?

4

2 回答 2

3

除了Matthias Bauch 的回答,我可以给你一些提示来理解关系。

首先,当你处理 Core Data 时,你必须从对象的角度来思考。通过这种抽象,您可以将模型视为一个图,其中节点是您在模型中创建的实体,而关系是这些实体之间的链接。

现在,关于关系,它们可以是不同的类型:一对一、一对多和多对多。根据您拥有的关系类型,您可以在对象图中创建不同的链接。例如,如果 aUser与 具有一对多关系Picture,则意味着(类型为NSManagedObject)的每个对象实例都有指向不同Pictures 的链接。User作为源,Pictures,作为目的地。

Core Data 使用反向关系来保持图形的一致性。特别是,当您处理删除规则时,它们很有用。

每个关系都有一个与之关联的删除规则。级联意味着如果你删除一个对象,比如User,Core Data 将为你删除Picture链接到它的对象(s)。如果有链接到它,拒绝不允许删除。Nullify意味着从 a到 a的链接将被破坏。这并不意味着对象被删除。就对象图而言,这意味着您不再有这些对象之间的链接。无操作意味着源被删除,目标始终存在并且它继续指向不再存在的对象。所以,不像NullifyUserPicturePictureUser,您需要手动断开该链接。如果不是,您可能会有图表不一致。尽量避免这种类型的关系。

如果你想知道别的,请告诉我。

编辑

查看核心数据编程指南关系部分以获取更多信息。

于 2012-06-18T20:36:01.093 回答
2

我不知道这是否可能,但听起来你对两个关系使用了相同的反向目标。不要那样做。

正确的方法是这样的:

在此处输入图像描述

于 2012-06-18T17:35:29.767 回答