您知道如何从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
,如果实际上需要它?谁想要“部分”从数据库中删除对象?
我对此缺少什么?
答案 0 :(得分:2)
仅仅因为您从关系中移除了Bookmark
,这并不一定意味着您希望将其删除:拥有与当前不相关的Bookmark
可能完全有效任何物体。例如,假设SomeManagedObject
是ShoppingBasket
,而Bookmark
是ShoppingItem
- 您是否要从商店中删除ShoppingItem
,只是因为有人将其删除了来自他们的ShoppingBasket
?
但事实恰恰相反:如果您删除了Bookmark
,则不得留下与之相关的任何Objects
。坏事可能(通常会)发生。因此,CoreData提供了一种机制(请参阅Core Data Programming Guide中的“关系删除规则”),以便在删除源对象时自动处理相关对象。因此,如果使用所需的删除规则配置关系,则可以使用:
[managedObjectContext deleteObject:myBookmark]
和CoreData将整理关系。 (例如,如果您指定了“nullify”删除规则,它将有效地调用
[someManagedObject removeBookmarkObject:myBookmark]
表示与myBookmark
相关的所有托管对象。)
答案 1 :(得分:1)
removeBookmarkObject
打破了SomeManagedObject
和Bookmark
之间的关系。这并不意味着删除Bookmark
,因为这是一个可能会或可能不相关的不同行为。它不是“部分”删除,实际上它不是任何类型的删除。这是否有用取决于您的具体数据以及您如何使用它。你想要打破这种关系的一些原因可能包括:
Bookmark
重新分配给SomeObject
的其他实例。您的特定应用可能会使用其中一个或两个,或两者都不使用。无论如何,打破关系和删除对象都不是一回事,即使是“部分”。