2011-08-18 43 views
11

Tôi nhận được một lỗi khi lưu bối cảnh dữ liệu cốt lõi của tôi, đây là nhật ký:Core Data lỗi chưa được giải quyết trên tiết kiệm

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\"}"; 
} 

tôi nhận được lỗi này sau khi gỡ bỏ và xóa một đối tượng:

[productList removeMProductObject:product]; 
[[delegate managedObjectContext] deleteObject:product]; 
[delegate saveContext]; 

tôi cũng lưu ý rằng tôi cũng nhận được lỗi cho các tình huống sau (gỡ lỗi):

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

Đôi khi, tôi có thể p xung quanh đối tượng productList hoặc product (cả hai loại NSManagedObject) cho các bộ điều khiển khác, luôn sử dụng assign trong thuộc tính và không bao giờ retain. productList là một đối tượng có thể chứa nhiều đối tượng product.

I am có thể tạo đối tượng mới (NSManagedObject), nhưng khi nói đến việc xóa chúng tôi nhận được lỗi được đề cập ở trên. Khi chạy ứng dụng trong trình mô phỏng, tôi theo dõi sát tập tin sqlite. sau khi cố xóa một đối tượng (mã ở trên), tôi nhận thấy tệp .sqlite đã bị xóa.

Tôi đã tạo một vài ứng dụng iPhone Dữ liệu cốt lõi không có vấn đề nhưng dường như tôi đang gặp sự cố ở đây. Tôi không tin rằng tôi đang làm bất cứ điều gì trong số các thông thường nhưng có lẽ tôi đang thiếu một chi tiết nhỏ, nhưng tôi không biết những gì!

Tại sao tệp .sqlite của tôi bị xóa và dẫn đến thông báo lỗi này khi lưu?

Làm cách nào tôi có thể tìm thấy thông báo lỗi hữu ích hơn để tôi có thể xác định nguyên nhân của lỗi này?

Trả lời

14

Tìm thấy vấn đề, nhưng tôi không chắc chắn lý do tại sao nó sửa chữa nó:

Trước khi tôi sẽ xóa/gỡ bỏ các đối tượng tôi sẽ xóa các hình ảnh liên kết với nó (được lưu trữ trong thư mục của tài liệu).

Những hình ảnh theo mặc định không có giá trị (không), nhưng tôi sẽ cố gắng để xóa nó anyway:

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 

nếu tôi thay vì làm một kiểm tra con số không trước khi cố gắng loại bỏ các hình ảnh như thế này, tôi nhận được không lỗi khi tôi xóa chính đối tượng được quản lý:

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 

tôi đoán đang cố gắng truy cập vào hình ảnh của sản phẩm khi không phải là tất cả không hợp lệ.

+0

Cảm ơn bạn SO VERY MUCH. Tôi đã có chính xác cùng một vấn đề và giải pháp là để nil kiểm tra hình ảnh đầu tiên. – Eugene

+0

Người đàn ông, tuyệt vời. Tôi đã trải qua mãi mãi về điều này. – Beaker

+5

Điều này: * "sau khi cố xóa một đối tượng (mã ở trên), tôi nhận thấy tệp .sqlite đã bị xóa." * Có vẻ như bạn đang xóa toàn bộ thư mục Tài liệu nếu 'imageName' là nil, vì' removeItemAtPath: 'cũng loại bỏ các thư mục đệ quy và thêm nil vào đường dẫn tài liệu một cách hiệu quả không làm gì cả. – mvds

0

Tôi gặp sự cố tương tự đáng báo cáo cho bất kỳ shmo kém nào bị cuốn vào sự cố này. Trong trường hợp của tôi, tôi đã có một bộ điều khiển xem bảng xử lý xóa hàng bằng cách xóa dữ liệu tương ứng khỏi mô hình dữ liệu. Khi tôi sử dụng phương thức remove ## ObjectName ## Object (được stubbed bởi lớp con NSManagedObject được tạo tự động), tôi sẽ nhận được một lỗi tương tự như lỗi mà bạn đã báo cáo.

Khi tôi thay vì sử dụng NSManagedObjectContext: deleteObject Tôi không gặp sự cố khi lưu ngữ cảnh. Nhưng, tôi quan sát thấy một ngoại lệ được ném mà không có dấu hiệu của lý do từ bàn điều khiển.

Nó chỉ ra phương thức tableView canEditRowAtIndexPath: đã được gọi cho hàng tương ứng với đối tượng mới bị xóa. Đã rõ ràng số hàng của tôi cần được cập nhật trước khi hệ điều hành gọi phương thức này. Nhưng, tôi không quan tâm. Tôi chỉ cần kiểm tra xem kích thước của mảng các đối tượng được quản lý của tôi có thể được lập chỉ mục bởi hàng indexPath hay không.

if([managedObjSet.objects count] > indexPath.row) { 
     ManagedObject* obj = [managedObjectArray objectAtIndex:indexPath.row]; 
     return ([obj.anotherManagedObjSet count] ==0); 
    } 
Các vấn đề liên quan