我在Core Data应用程序中有一个非常奇怪的行为。 这是代码:
unaReg.valore = [NSNumber numberWithInt:val];
NSError *error;
if (![managedObjectContext save:&error]) {
[myUtil manageError:[error localizedDescription]];
}
unaReg
是核心数据实体,我想更新其valore
属性。
当我运行save
命令(managedObjectContext save:&error
)时,由于程序在if
分支内部流动,我收到错误。奇怪的行为是error
变量是nil
并且新值在数据库中正确保存(因此似乎没有错误)。
怎么了????
感谢。
答案 0 :(得分:4)
您需要将NSError *error = nil;
设置为安全,否则您将分配未确定的内存位置。
与提到的gerry3一样,你可能有一个nil managedObjectContext。我建议将代码更改为:
unaReg.valore = [NSNumber numberWithInt:val];
NSError *error = nil;
NSAssert(managedObjectContext != nil, @"Context is nil");
if (![managedObjectContext save:&error]) {
[myUtil manageError:[error localizedDescription]];
}
这是NSAssert语句的完美用法,因为您可以在开发时使用它们进行内联测试,并使用一个开关,将它们全部关闭以进行生产。
如果您的managedObjectContext为nil,那么您将从-save获得错误响应:并且因为您没有将错误设置为nil,它将指向内存中的“某事”,进一步导致混淆。
答案 1 :(得分:1)
仔细检查您的托管对象上下文是否已设置:
unaReg.valore = [NSNumber numberWithInt:val];
NSError *error;
NSLog(@"moc = %@",managedObjectContext);
if (![managedObjectContext save:&error]) {
[myUtil manageError:[error localizedDescription]];
}
答案 2 :(得分:0)
如果managedObjectContext不为null,则您可能还需要检查存储在managedObjectContext中的其他托管对象。有时,当您只需要保存unaReg
对象时,错误可能位于删除某些其他对象中。
我通常做的是:
- 检查Delete rule
上的数据模型,确保已正确配置所有数据模型
- 在managedObjectContext的保存操作上,确保由于Delete rule
而以某种方式删除了其他对象。
我遇到的其他一些情况,但现在我想不到。
希望有所帮助