我是否需要调用 NSManagedObjectContext deleteObject

Do I need to call NSManagedObjectContext deleteObject

您知道如何从 NSManagedObject 生成 class,它会为您创建 CoreDataGeneratedAccessors...

@interface SomeManagedObject (CoreDataGeneratedAccessors)

- (void)addBookmarkObject:(Bookmark *)value;
- (void)removeBookmarkObject:(Bookmark *)value;
- (void)addBookmark:(NSSet *)values;
- (void)removeBookmark:(NSSet *)values;

好吧,不得不打电话给...

似乎是多余的
[someManagedObject removeBookmarkObject:myBookmark]

其次是....

[managedObjectContext deleteObject:myBookmark]

如果确实需要,为什么 removeBookmarkObject 不为我调用 deleteObject?谁会想要 'partially' 从他们的数据库中删除一个对象??

我错过了什么?

removeBookmarkObject 打破了 SomeManagedObjectBookmark 之间的关系。这并不意味着删除 Bookmark,因为这是可能相关也可能不相关的不同操作。这不是 "partial" 删除,事实上它不是任何类型的删除。这是否有用实际上取决于您的特定数据以及您如何使用它。您想要中断关系的一些原因可能包括:

  • 您计划将 Bookmark 重新分配给 SomeObject 的另一个实例。
  • 此关系是可选的,这意味着它可以为零,因此有时您希望在不删除任何对象的情况下中断关系是有道理的。

您的特定应用可能会使用其中之一或两者,或两者都不使用。无论如何,打破关系和删除对象不是一回事,甚至 "partially".

只是因为您从关系中删除了 Bookmark,并不一定意味着您希望删除它:拥有一个 Bookmark 可能是完全有效的,但(目前)与任何对象有关。例如,假设 SomeManagedObjectShoppingBasket,而 BookmarkShoppingItem - 您是否想从您的商店中删除 ShoppingItem,只是因为有人删除了它来自他们的 ShoppingBasket?

但反之则不然:如果您删除 Bookmark,则不能留下任何与之相关的 Objects。坏事可能(而且通常会)发生。因此,CoreData 提供了一种机制(参见 Core Data Programming Guide 中的 "Relationship Delete Rules"),当您删除源对象时自动处理相关对象。因此,如果关系配置了您想要的删除规则,您可以只使用:

[managedObjectContext deleteObject:myBookmark]

CoreData 会理清关系。 (例如,如果您指定了 "nullify" 删除规则,它会有效地调用

[someManagedObject removeBookmarkObject:myBookmark]

对于与 myBookmark 相关的所有 managedObjects。)