【问题标题】:Proper updating of an NSManagedObject's relationship正确更新 NSManagedObject 的关系
【发布时间】:2013-12-20 04:27:27
【问题描述】:

我想清楚地了解我做插图时会发生什么:

Book *newBook = [NSEntityDescription insertNewObjectForEntityForName:@"Book" inManagedObjectContext:context];
// setting book's attributes
Person *peter = [Person queryAndReturnBookCollectionWithName:@"Peter Parker"]; // returns already recorded collection with an already set "favorite book" relationship
peter.favoriteBook = newBook;

我的猜测是之前在 peter.favoriteBook 中记录的 Book 实例没有被删除,而是保持存储,对吗? 那么我应该在设置新值之前手动检查它是否存在并删除它,还是有更简洁的方法呢?

【问题讨论】:

  • 当你创建 book 的实例(比如 book1)时,就像你做的那样,在数据库中创建一个对象(假设你保存了某个时间)。当您将此对象分配给 peter.favouriteBook=book1 之类的关系时,您只是在建立关系。如果您现在创建另一本书(比如 book2)并将相同的关系分配给 book2(peter.favouriteBook=book2),那么唯一改变的就是关系。 book1 和 book2 仍然存在于 Book 表中。我的猜测是您不想删除 book1,因为它很可能是其他人最喜欢的书!
  • 在 Book 上,您可能会考虑有一个名为 Book.favouredBy 的 To-Many 关系,它是 Person.favoriteBook 的倒数。 book1.favouredBy 将返回所有最喜欢的书是 book1 的人的 NSSet。
  • 感谢您的清晰解释:)

标签: ios objective-c core-data entity-relationship nsmanagedobject


【解决方案1】:

favoriteBook 的先前值没有被删除,但该对象不再为该关系指向它。所以,peter 之前的 favoriteBook 仍然会存在于 core data 中,但是 peter.favoriteBook 会返回分配给它的新值。

【讨论】:

  • 正如我所想,谢谢。太糟糕了 Xcode 不包含核心数据浏览器
  • 但是反向关系呢,peter.favourite书不再指向的Book的实例是否仍然指向peter?
  • 不,一旦关系破裂,两个对象都不会相互指向。核心数据知道反向关系并相应地更新它
猜你喜欢
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 2023-04-02
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多