gpt4 book ai didi

objective-c - 在一对一关系的核心数据删除过程中查找 NSManagedObject 时出现问题

转载 作者:行者123 更新时间:2023-12-03 17:41:11 27 4
gpt4 key购买 nike

更新:下面的 Martin R 提供了一个非常清晰(且简洁!)的答案,几乎回答了我的问题。我想我应该改一下:

您能想到为什么在调用 prepareForDeletion 时获取连接到另一个 NSManagedObject 的 NSManagedObject 不起作用的任何原因吗?考虑到此类对象与要删除的对象是一对一连接的?

我需要能够调用prepareForDeletion,以便在决定是否应该删除对象的子对象之前运行一些实体检查。

<小时/>

当对象是一对一关系时,在 Core Data 中删除对象的子对象有什么技巧吗?

我有一个相当复杂的核心数据模型,其中删除单个 NSManagedObject 还应该通过 prepareForDeletion 删除其子 NSManagedObjects。在删除之前运行一系列调试 NSLog 语句表明所有关系都已正确设置。然而,当实际尝试删除该对象时,似乎许多(尽管不是全部)这些关系已经丢失,因为尝试通过 NSFetchRequest 获取这些对象中的一些(但不是全部)会返回空数组。

我似乎无法弄清楚如何获取找到的对象与未找到的对象之间有任何区别,除了找到的对象是多对多关系,而找不到的对象是一对一关系:-/

要删除“主”对象,我只需调用 [managementObjectContext deleteObject:mainObject];,并在主对象的私有(private) 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”具有一对一关系。

最佳答案

如果您正确设置关系的“删除规则”,则核心数据可以自动处理删除“依赖”对象。在这种情况下,您可以设置

  • 删除从 MainObjectChildX 到“Cascade”的关系规则,
  • 删除从 ChildXMainObject 的反向关系规则到“Nullify”。

这意味着

  • 如果删除MainObject,则相关的ChildX对象也会被删除。
  • 如果删除 ChildX 对象,则相关 MainObject 的关系值将设置为 NULL。

关于objective-c - 在一对一关系的核心数据删除过程中查找 NSManagedObject 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14128815/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com