【问题标题】:Core Data unresolved error on save保存时核心数据未解决错误
【发布时间】:2011-10-29 21:46:36
【问题描述】:

保存核心数据上下文时出现错误,这是日志:

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];

有时,我可能会将productListproduct 对象(均为NSManagedObject 类型)传递给其他控制器,始终在属性中使用assign 而从不使用retainproductList 是一个可能包含许多 product 对象的对象。

能够创建新对象(NSManagedObject),但是在删除它们时,我得到了上面提到的错误。在模拟器中运行应用程序时,我会密切关注 sqlite 文件。在尝试删除对象(上面的代码)后,我注意到 .sqlite 文件已被删除。

我已经创建了一些没有问题的 Core Data iphone 应用程序,但我似乎在这里遇到了问题。我不相信我在做任何不寻常的事情,但也许我错过了一个小细节,但我不知道是什么!

为什么我的 .sqlite 文件被删除并导致保存时出现此错误消息?

如何找到更有用的错误消息,以便确定此错误的原因?

【问题讨论】:

    标签: iphone cocoa-touch core-data


    【解决方案1】:

    我有一个类似的问题值得报告任何陷入此问题的可怜的 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);
        }
    

    【讨论】:

      【解决方案2】:

      找到了问题,但我不确定为什么会解决它:

      在我删除/删除对象之前,我将删除与其关联的图像(存储在文档的目录中)。

      默认情况下图像没有值(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
      

      如果我在尝试像这样删除图像之前进行 nil 检查,则在删除托管对象本身时不会出错:

          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 时尝试访问产品的图片会使它全部无效。

      【讨论】:

      • 非常感谢。我遇到了完全相同的问题,解决方案是先检查图像。
      • 伙计,太棒了。我花了一辈子的时间。
      • 这个:“在尝试删除一个对象(上面的代码)后,我注意到 .sqlite 文件被删除了。” 听起来你实际上是在删除整个 Documents 目录,如果imageName 是 nil,因为 removeItemAtPath: 还递归删除目录,并且将 nil 附加到文档路径实际上没有任何作用。
      • 发生这种情况是因为您在 removeItemAtPath 中引发了异常。但由于您位于文档保存操作所拥有的块内,它会使应用程序崩溃。
      • 太棒了.. 它拯救了我的一天.. thnx :-)
      猜你喜欢
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多