我在保存核心数据上下文时遇到错误,这是日志:
Unresolved error Error Domain=NSCocoaErrorDomain Code=134030 "The operation couldn’t be completed. (Cocoa error 134030.)" UserInfo=0x1937a0 {NSAffectedStoresErrorKey=(
"<NSSQLCore: 0x156410>"
), NSUnderlyingError=0x181a60 "The operation couldn’t be completed. (Cocoa error 4.)", NSFilePath=/var/mobile/Applications/appid/Documents/appname.sqlite}, {
NSAffectedStoresErrorKey = (
"<NSSQLCore: 0x156410>"
);
NSFilePath = "/var/mobile/Applications/appid/Documents/appname.sqlite";
NSUnderlyingError = "Error Domain=NSCocoaErrorDomain Code=4 \"The operation couldn\U2019t be completed. (Cocoa error 4.)\" UserInfo=0x181a30 {NSUnderlyingError=0x108ab0 \"The operation couldn\U2019t be completed. No such file or directory\"}";
}
删除和删除对象后,我收到此错误:
[productList removeMProductObject:product];
[[delegate managedObjectContext] deleteObject:product];
[delegate saveContext];
我还注意到我也收到以下情况(调试)的错误:
1.
[productList removeMProductObject:product];
[delegate saveContext];
2.
[[delegate managedObjectContext] deleteObject:product];
[delegate saveContext];
3.
[[delegate managedObjectContext] deleteObject:product];
[productList removeMProductObject:product];
[delegate saveContext];
4.
[[delegate managedObjectContext] deleteObject:product];
[delegate saveContext];//error
[productList removeMProductObject:product];
[delegate saveContext];
5.
[productList removeMProductObject:product];
[delegate saveContext];//error
[[delegate managedObjectContext] deleteObject:product];
[delegate saveContext];
有时,我可以将productList
或product
对象(类型NSManagedObject
)传递给其他控制器,始终在属性中使用assign
,永远不会retain
。 productList
是一个可能包含许多product
个对象的对象。
我我能够创建新对象(NSManagedObject
),但在删除它们时,我会收到上述错误。在模拟器中运行应用程序时,我会密切关注sqlite文件。在尝试删除对象(上面的代码)之后,我注意到.sqlite文件已被删除。
我创建了一些Core Data iphone应用程序没有问题,但我似乎在这里遇到了问题。我不相信我做了一些与众不同的事情,但也许我错过了一个小细节,但我不知道是什么!
为什么我的.sqlite文件被删除并导致保存时出现此错误消息?
如何找到更有用的错误消息,以便我可以确定此错误的原因?
答案 0 :(得分:14)
发现问题,但我不确定为什么要修复它:
在我删除/删除对象之前,我会删除与其关联的图像(存储在文档的目录中)。
默认情况下,图像没有值(nil),但无论如何我都会尝试删除它:
NSError *deleteError = nil;
[[NSFileManager defaultManager] removeItemAtPath:[DOCUMENTS_DIRECTORY stringByAppendingPathComponent:product.mPictureName] error:&deleteError];
#ifdef DEBUG_MODE
if(deleteError) {
NSLog(@"Error deleting image: %@", [deleteError description]);
}
else {
NSLog(@"Image %@ deleted.", product.mPictureName);
}
#endif
如果我在尝试删除这样的图像之前做了一个零检查,当我删除托管对象本身时,我没有收到任何错误:
NSString *imageName = product.mPictureName;
if(imageName) {
NSError *deleteError = nil;
[[NSFileManager defaultManager] removeItemAtPath:[DOCUMENTS_DIRECTORY stringByAppendingPathComponent:imageName] error:&deleteError];
#ifdef DEBUG_MODE
if(deleteError) {
NSLog(@"Error deleting image: %@", [deleteError description]);
}
else {
NSLog(@"Image %@ deleted.", imageName);
}
#endif
}
...
//delete NSManagedObject and save
我想在nil时尝试访问产品的图片会使其无效。
答案 1 :(得分:0)
我有一个类似的问题,值得报告任何陷入这个问题的糟糕的shmo。在我的例子中,我有一个表视图控制器,通过从数据模型中删除相应的数据来处理行删除。当我使用remove ## ObjectName ## Object方法(由自动生成的NSManagedObject子类存根)时,我会收到与您报告的类似的错误。
当我改为使用NSManagedObjectContext:deleteObject时,我没有遇到保存上下文的问题。但是,我观察到一个异常被抛出,没有任何理由来自控制台。
事实证明,正在为与新删除的对象相对应的行调用tableView方法canEditRowAtIndexPath :.很明显,在调用此方法的操作系统之前,我的行计数需要更新。但是,我不在乎。我只是检查是否可以通过indexPath行索引我的托管对象数组的大小。
if([managedObjSet.objects count] > indexPath.row) {
ManagedObject* obj = [managedObjectArray objectAtIndex:indexPath.row];
return ([obj.anotherManagedObjSet count] ==0);
}