UPDATE:下面马丁R已经提供了一个非常明确的(和简洁!)回答almosts回答我的问题。我想我应该改为:问题核心数据删除的过程中发现NSManagedObject的一对一关系
你可以想一下,为什么在调用prepareForDeletion
时,获取连接到另一个NSManagedObject的NSManagedObjects不起作用,因为这样的对象与被删除的对象是一对一连接的?
我需要能够调用prepareForDeletion
,以便我可以在决定是否删除对象的子项之前运行一些实体检查。
是否有任何技巧在核心数据中删除对象的子对象时它是一对一的关系?
我有一个相当复杂的核心数据模型,其中删除单个NSManagedObject也应通过prepareForDeletion
删除其子NSManagedObjects。在删除之前立即运行一系列调试NSLog语句,可以发现所有关系都已正确设置。但是,当实际尝试删除对象时,似乎很多(尽管不是全部)这些关系已经丢失,因为试图通过NSFetchRequest获取一些(但是不是全部)这些对象返回空数组。
我似乎无法弄清楚我如何获取找到的对象与未找到的对象之间的任何区别,除了那些找到的是相反的 - 许多关系,而那些无法找到的关系是一个一对一的关系: -/
要删除“主”对象,我只是打电话[managedObjectContext deleteObject:mainObject];
,主要对象的私有API中我已经覆盖prepareForDeletion
如下:
- (void)prepareForDeletion
{
// [super prepareForDeletion]; // commented but uncommenting doesn't change results
[MyDataManager deleteChildOneForMainObject:self];
[MyDataManager deleteChildrenTwoForMainObject:self];
[MyDataManager deleteChildrenThreeForMainObject:self];
}
其中MyDataManager
是一个只包含类方法的自定义NSObject。 MyDataManager然后搜索通过以下一个类似于相应于被管理对象的上下文NSManagedObjects:
- (BOOL)deleteChildOneForMainObject:(MainObject *)mainObject
{
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"ChildOne" inManagedObjectContext:managedObjectContext];
[fetch setEntity:entity];
[fetch setPredicate:[NSPredicate predicateWithFormat:@"(mainObject == %@)", mainObject]];
NSError *error;
NSArray *childOnesToDelete = [managedObjectContext executeFetchRequest:fetch error:&error];
if (childOnesToDelete.count > 1)
{
NSLog(@"[WARNING] More than one ChildOne for mainObject found; deleting all");
}
NSLog(@"[TEST] Deleting %i ChildOnes", childOnesToDelete.count);
for (ChildOne *childOne in childOnesToDelete)
{
[managedObjectContext deleteObject:childOne];
}
if ([managedObjectContext save:&error]) return YES;
else NSLog(@"[WARNING] Save error for function [deleteChildOneForMainObject:]");
return NO;
}
同样,类型“MainObject”的每个NSManagedObject具有一对一的关系为“ChildOne”和一对与“ChildTwo”和“ChildThree”的多种关系。 “Child One”,“ChildTwo”和“ChildThree”都与“MainObject”具有一对一的关系。
一个更简单的解决方案可能是将关系的“删除规则”从* MainObject *设置为* ChildX *设置为“Cascade”。然后删除* MainObject *实体的对象会自动删除* ChildX *实体的所有相关对象。 –
由于@MartinR建议你应该使用删除规则。你使用什么类型的规则?看看这里https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html –
从* ChildX *到* MainObject *设置为nullify。这意味着:如果一个孩子被删除,对父母不做任何事情。 –