Core Data的详细反比关系

时间:2013-09-17 19:00:19

标签: ios core-data

我很难绕过Core Data的反向关系。例如,假设有两个实体:postcomment,其中

  • post has_many comments
  • comment belongs_to post

使用xcode的可视化coredata编辑器,我将创建两个实体,然后通过以下方式链接它们:

  1. post关联到目标comment并选择to many
  2. comment关联到目标post而不选择to many
  3. 确保上面#2的关系是#1的inverse
  4. 这是我的问题:

    1. 当您选择inverse时,幕后实际发生了什么。与ActiveRecord中的其他ORM相同的是什么。
    2. 如果不是将#2的反义指定为#1而不是指定#1,那么它会产生相同的效果吗?我说它的反转是#2?

2 个答案:

答案 0 :(得分:0)

我经常听到的一句话是,CoreData主要是维护一个对象图,另一个是ORM。所以考虑到这一点,我会说在你设置inverse关系的幕后,你注意到它是一个双向关系而不是两个单向关系。如果没有这个,您可以指定comment有多个posts但是如果您在评论中添加帖子,则可能无法将评论中的图表遍历到帖子然后返回

来自ActiveRecord可能没有多大意义,如果您将其视为保留密钥并注明关系 - 但CoreData可以有许多不同的数据存储格式,并且存储数据并不暗示反向关系。

如果你去#1并说它的倒数是#2,它应该具有相同的效果 - 但这很容易测试和看。

答案 1 :(得分:0)

  1. 设置反转意味着如果更改一个关系,则反向保持同步。例如,如果您向帖子添加评论,则会自动设置评论的“发布”关系。同样,如果您设置了Comment的post属性,那么该Comment将自动添加到Post的comments集合中。因此,以下两行代码是等效的:

    newComment.post = aPost;
    [aPost addCommentsObject:newComment];
    
  2. 如果你没有指定逆,那么你必须包括两条线来创建关系。建议使用反转,因为它更容易维护对象图的完整性。实际上这在商店中的持久性取决于商店类型,但如果您使用的是sqlite商店,那么很容易看到内部数据,看看Core Data正在做什么。

    1. 他们是等同的。