我是否需要调用NSManagedObjectContext deleteObject

时间:2016-01-18 23:10:57

标签: core-data nsmanagedobject nsmanagedobjectcontext

您知道如何从NSManagedObject生成类,并为您创建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,如果实际上需要它?谁想要“部分”从数据库中删除对象?

我对此缺少什么?

2 个答案:

答案 0 :(得分:2)

仅仅因为您从关系中移除了Bookmark,这并不一定意味着您希望将其删除:拥有与当前不相关的Bookmark可能完全有效任何物体。例如,假设SomeManagedObjectShoppingBasket,而BookmarkShoppingItem - 您是否要从商店中删除ShoppingItem,只是因为有人将其删除了来自他们的ShoppingBasket

但事实恰恰相反:如果您删除了Bookmark,则不得留下与之相关的任何Objects。坏事可能(通常会)发生。因此,CoreData提供了一种机制(请参阅Core Data Programming Guide中的“关系删除规则”),以便在删除源对象时自动处理相关对象。因此,如果使用所需的删除规则配置关系,则可以使用:

[managedObjectContext deleteObject:myBookmark]

和CoreData将整理关系。 (例如,如果您指定了“nullify”删除规则,它将有效地调用

[someManagedObject removeBookmarkObject:myBookmark]

表示与myBookmark相关的所有托管对象。)

答案 1 :(得分:1)

removeBookmarkObject打破了SomeManagedObjectBookmark之间的关系。这并不意味着删除Bookmark,因为这是一个可能会或可能不相关的不同行为。它不是“部分”删除,实际上它不是任何类型的删除。这是否有用取决于您的具体数据以及您如何使用它。你想要打破这种关系的一些原因可能包括:

  • 您计划将Bookmark重新分配给SomeObject的其他实例。
  • 这种关系是可选的,这意味着它被允许为零,所以有时你想要在不删除任何对象的情况下破坏关系是有道理的。

您的特定应用可能会使用其中一个或两个,或两者都不使用。无论如何,打破关系和删除对象都不是一回事,即使是“部分”。