Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios CoreData-删除背景上下文中的对象时行为不一致(附加测试项目)_Ios_Objective C_Core Data - Fatal编程技术网

Ios CoreData-删除背景上下文中的对象时行为不一致(附加测试项目)

Ios CoreData-删除背景上下文中的对象时行为不一致(附加测试项目),ios,objective-c,core-data,Ios,Objective C,Core Data,在我们的一个应用程序中,我们遇到了与删除具有多个上下文的对象相关的奇怪行为 删除背景上下文中的对象后,该对象仍然存在于其父对象的关系中。 删除使用现有ID为的objectWithID获取的对象时出错,但使用ID为的objectWithID或通过executeFetchRequest获取的对象时出错 然而,由于文档表明现有的objectwithid是一种更安全的使用方法,因此我们不希望更改它,也不希望在其他地方引入崩溃 例子 在下面的输出中,创建了5个子对象,然后逐个删除 安装程序 主上下文中fe

在我们的一个应用程序中,我们遇到了与删除具有多个上下文的对象相关的奇怪行为

删除背景上下文中的对象后,该对象仍然存在于其父对象的关系中。

删除使用现有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”; } 删除子项
***已删除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];