在重新排序两行后,在单线程应用程序上保存简单数据时遇到问题。
我已设法简化编码以重现错误,并希望其他人尝试这一点后提出第二意见。
这是一个健全性检查,因为我怀疑 iOS 7 引入的核心数据问题,因为这在 iOS 6 中运行良好。
首先,启动一个新的核心数据项目并创建这个模型......
属性“当前”是一个可选的布尔值。一对多关系是有序关系,创建一个 NSOrderedDataset。
现在向应用程序添加几个按钮;第一个创建数据(一个项目和两个关联的“图纸”),第二个交换两个图纸,然后在第一个图纸中设置一个属性。
这是代码...
-(IBAction)onTestButton:(id)sender
{
id delegate = [[UIApplication sharedApplication]delegate];
NSManagedObjectContext *managedObjectContext = [delegate managedObjectContext];
self.project = [NSEntityDescription insertNewObjectForEntityForName:@"Project" inManagedObjectContext:managedObjectContext];
Drawing *drawing1 = [NSEntityDescription insertNewObjectForEntityForName:@"Drawing" inManagedObjectContext:managedObjectContext];
Drawing *drawing2 = [NSEntityDescription insertNewObjectForEntityForName:@"Drawing" inManagedObjectContext:managedObjectContext];
NSMutableOrderedSet* tempSet = [NSMutableOrderedSet orderedSetWithOrderedSet:self.project.drawings];
[tempSet addObject:drawing1];
[tempSet addObject:drawing2];
self.project.drawings = tempSet;
[self save];
}
-(IBAction)onTestButton2:(id)sender
{
NSMutableOrderedSet *exchange = [self.project mutableOrderedSetValueForKey:@"drawings"];
[exchange exchangeObjectAtIndex:0 withObjectAtIndex:1];
self.project.drawings = exchange;
[self save];
Drawing *drawing = [self.project.drawings objectAtIndex:0];
BOOL current = [drawing.current boolValue];
drawing.current = [NSNumber numberWithBool:!current];
[self save];
}
-(void)save
{
id delegate = [[UIApplication sharedApplication]delegate];
NSManagedObjectContext *managedObjectContext = [delegate managedObjectContext];
NSError *error = nil;
if( ![managedObjectContext save:&error] )
{
NSLog(@"%@ Save: Unresolved Error on Save %@", error, [error userInfo] );
abort();
}
}
现在,按下第一个测试按钮进行测试。这设置了数据。
然后按第二个测试按钮....一切OK!!!
现在再次按下第二个测试按钮并 BANG。你应该得到一个类似这样的 NSMergeConflict 错误......
保存:保存时未解决的错误 { conflictList = ( "NSMergeConflict (0x8a7d0b0) for NSManagedObject (0x8bedfa0) with objectID '0x8bd9340 ' with oldVersion = 1 and newVersion = 2 and old object snapshot = {\n
current = \"\";\n project = \"0x8bc3f50 \";\n} 和新缓存行 = {\n current = \"\";\n project = \"0x8aa88c0 \";\n}" );
我从错误中注意到我的项目对象已更改。但是,这是一个使用主应用程序上下文的单线程应用程序。
我在这方面花了太长时间,希望其他人能就问题所在发表评论。这是一个核心数据错误,还是我是一个正确的“傻瓜”?
非常感谢
/适合