Ios CoreData-删除背景上下文中的对象时行为不一致(附加测试项目)
在我们的一个应用程序中,我们遇到了与删除具有多个上下文的对象相关的奇怪行为 删除背景上下文中的对象后,该对象仍然存在于其父对象的关系中。 删除使用现有ID为的objectWithID获取的对象时出错,但使用ID为的objectWithID或通过executeFetchRequest获取的对象时出错 然而,由于文档表明现有的objectwithid是一种更安全的使用方法,因此我们不希望更改它,也不希望在其他地方引入崩溃 例子 在下面的输出中,创建了5个子对象,然后逐个删除 安装程序 主上下文中fetchRequest的子级:5 背景背景中请求的儿童:5 主上下文中按父关系列出的子项:5 背景背景中的亲子关系:5 mainContext上的父级:{ 儿童=( “93139831-EAC9-46AF-9B93-7AFBCAA3C380”, “19E51ADE-4524-4285-9DF3-4B0DDE58FAA2”, “73082A38-ECC3-45FA-995E-3ADD46671A46”, “6D7752E3-44BF-4418-A9DD-607896167510”, “CB325763-E340-4FF2-96E8-67206794C91B” ); id=“69B4180C-91BB-4B4D-8F01-B1612C7B6B0E”; } 背景背景中的家长:{ 儿童=( “19E51ADE-4524-4285-9DF3-4B0DDE58FAA2”, “6D7752E3-44BF-4418-A9DD-607896167510”, “73082A38-ECC3-45FA-995E-3ADD46671A46”, “CB325763-E340-4FF2-96E8-67206794C91B”, “93139831-EAC9-46AF-9B93-7AFBCAA3C380” ); id=“69B4180C-91BB-4B4D-8F01-B1612C7B6B0E”; } 删除子项Ios CoreData-删除背景上下文中的对象时行为不一致(附加测试项目),ios,objective-c,core-data,Ios,Objective C,Core Data,在我们的一个应用程序中,我们遇到了与删除具有多个上下文的对象相关的奇怪行为 删除背景上下文中的对象后,该对象仍然存在于其父对象的关系中。 删除使用现有ID为的objectWithID获取的对象时出错,但使用ID为的objectWithID或通过executeFetchRequest获取的对象时出错 然而,由于文档表明现有的objectwithid是一种更安全的使用方法,因此我们不希望更改它,也不希望在其他地方引入崩溃 例子 在下面的输出中,创建了5个子对象,然后逐个删除 安装程序 主上下文中fe
***已删除ID为93139831-EAC9-46AF-9B93-7AFBCAA3C380的子项
***已删除ID为19E51ADE-4524-4285-9DF3-4B0DDE58FAA2的子项
***已删除ID为73082A38-ECC3-45FA-995E-3ADD46671A46的子项
***已删除ID为6D7752E3-44BF-4418-A9DD-607896167510的子项
***已删除ID为CB325763-E340-4FF2-96E8-67206794C91B的子项
删除后
主上下文中fetchRequest的子级:0
backgroundContext中fetchRequest的子级:0
mainContext中按父关系划分的子项:0
背景背景中的亲子关系:5
mainContext上的父级:{
儿童=(
);
id=“69B4180C-91BB-4B4D-8F01-B1612C7B6B0E”;
}
背景背景中的家长:{
儿童=(
“19E51ADE-4524-4285-9DF3-4B0DDE58FAA2”,
“6D7752E3-44BF-4418-A9DD-607896167510”,
“73082A38-ECC3-45FA-995E-3ADD46671A46”,
“CB325763-E340-4FF2-96E8-67206794C91B”,
“93139831-EAC9-46AF-9B93-7AFBCAA3C380”
);
id=“69B4180C-91BB-4B4D-8F01-B1612C7B6B0E”;
}
背景上下文中的CDiPart如何能够保留其子级,而在同一上下文中获取CDIChild时却不返回任何子级
删除后,请改为使用objectWithID
主上下文中fetchRequest的子级:0
backgroundContext中fetchRequest的子级:0
mainContext中按父关系划分的子项:0
backgroundContext中按父关系划分的子项:0
mainContext上的父级:{
儿童=(
);
id=“4C812CAB-4075-4A5C-9150-FDAEB4A6D238”;
}
背景背景中的家长:{
儿童=(
);
id=“4C812CAB-4075-4A5C-9150-FDAEB4A6D238”;
}
目前,我们使用executeFetchRequest作为解决方法,但问题表明我们的CoreData设置存在一个根本问题
测试项目
我已经创建了一个用于调试此问题的测试应用程序,可以在此处下载:
主要源代码
//
//AppDelegate.m
//核心数据问题
//
#导入“AppDelegate.h”
#导入“CDIParent.h”
#导入“CDIChild.h”
#进口
//-----------------------------------------------------------------
@实现AppDelegate
//-----------------------------------------------------------------
//-----------------------------------------------------------------
-(BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项;
//-----------------------------------------------------------------
{
[自我初始化数据];
[自初始化对象];
[自我再现问题];
返回YES;
}
#布拉格马克-私人
//-----------------------------------------------------------------
-(无效)不动产;
//-----------------------------------------------------------------
{
__块N错误*错误=nil;
//在backgroundContext上创建5个实体
[self.backgroundContext执行锁定和等待:^{
CDIParent*parent=[CDIParent parentInContext:self.backgroundContext错误:&error];
对于(整数i=0;i<5;i++){
[CDIChild childInParent:父错误:&错误];
}
//保存上下文
[self-saveContext:self.backgroundContext];
[self.main上下文执行锁定和等待:^{
[self-saveContext:self.mainContext];
}];
}];
[self-DebuggeChildrenWithComment:@“已创建对象”];
}
//-----------------------------------------------------------------
-(无效)重新创建问题;
//-----------------------------------------------------------------
{
[自我调试父母];
//删除所有实体
CDIParent*parent=[self parentInContext:self.mainContext];
而(parent.children.count>0){
[self-deleteChild:parent.children.allObjects.firstObject];
}
[自我调试父母];
}
//-----------------------------------------------------------------
-(void)deleteChild:(CDIChild*)子项;
//-----------------------------------------------------------------
{
__块N错误*错误=nil;
NSString*logID=child.childID;
NSManagedObjectID*objectID=child.objectID;
//删除背景内容
[self.backgroundContext执行锁定和等待:^{
//在backgroundContext中查找子对象
CDIChild*object=(CDIChild*)[self.backgroundContext existingObjectWithID
CDIParent *parent = [self parentInContext:self.mainContext];
CDIParent *parent = [self parentInContext:self.backgroundContext];
[self.backgroundContext reset];