2009-08-12 41 views
6

Tôi đang phát triển một ứng dụng trong ca cao. Tôi đang đối mặt với một vấn đề nghiêm trọng."Dữ liệu cốt lõi không thể hoàn thành lỗi .." lỗi

tôi đang xóa mục của một đối tượng tên là "Thư mục" trong Core Data sử dụng đoạn mã sau:

NSEnumerator *tempDirectories = [[folderArrayController arrangedObjects] objectEnumerator]; 
id tempDirectory; 
while (tempDirectory = [tempDirectories nextObject]){ 
    [managedObjectContext deleteObject:tempDirectory]; 
} 

Nhưng đôi khi một ngoại lệ như "Core Dữ liệu không thể thực hiện một lỗi .." xảy ra khi cố gắng lưu sau khi xóa. Tôi đang sử dụng mã số [managedObjectContext save];

Tôi mới trong Dữ liệu cốt lõi ... Mong được giải pháp.

+1

Xem đoạn thứ ba tại đây: [Lỗi không thể hoàn thành] (http://developer.apple.com/documentation/Cocoa/Conceptual/CoreData/Articles/cdTroubleshooting.html#//apple_ref/doc/uid/TP40002320- SW7) –

+0

Nhưng làm cách nào để gỡ lỗi và tìm ra mô-đun chính xác nào gây ra ngoại lệ này? –

Trả lời

4

Đây là một câu hỏi cũ, tôi đã đấu tranh giải quyết vấn đề này một thời gian. Vì vậy, nghĩ rằng nó sẽ là tốt nhất để ghi lại nó.

Như Weichsel đã đề cập ở trên, the Apple documentation đúng chỉ ra lý do ngoại lệ này. Nhưng đó là một công việc bận rộn để xác định mô-đun do đối tượng của lớp con NSManagedObject đang được giữ lại (nếu nguyên nhân được trích dẫn lần 1 trong tài liệu là nguyên nhân gốc rễ của vấn đề).

Vì vậy, tôi bắt đầu bằng cách xác định các phần của mã của tôi đã giữ lại NSManagedObject, thay vào đó tôi giữ lại NSManagedObjectID và tạo đối tượng được quản lý ra khỏi nó bất cứ khi nào cần. Cuộc thảo luận trong các dòng tương tự có thể được tìm thấy trong tài liệu hướng dẫn Restkit:

  1. https://github.com/RestKit/RestKit/commit/170060549f44ee5a822ac3e93668dad3b396dc39
  2. https://github.com/RestKit/RestKit/issues/611#issuecomment-4858605

Cập nhật setter của tôi và getter để giao diện với phần còn lại của các module vẫn giống nhau trong khi nội bộ bây giờ chúng tôi phụ thuộc khi NSManagedObjectID và tránh giữ lại NSManageObject:

-(CSTaskAbstract*)task 
{ 
    CSTaskAbstract *theTask = nil; 
    if (self.taskObjectID) 
    { 
     NSManagedObjectContext *moc = [(CSAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
     // https://github.com/RestKit/RestKit/commit/170060549f44ee5a822ac3e93668dad3b396dc39 & 
     // https://github.com/RestKit/RestKit/issues/611#issuecomment-4858605 
     NSError *theError = nil; 
     NSManagedObject *theObject = [moc existingObjectWithID:self.taskObjectID 
                 error:&theError]; 
     if ([theObject isKindOfClass:[CSTaskAbstract class]]) 
     { 
      theTask = (CSTaskAbstract*)theObject; 
     } 
    } 
    return theTask; 
} 
-(void)setTask:(CSTaskAbstract *)inTask 
{ 
    if (inTask!=self.task) 
    { 
     // Consequences of retaining a MO when it is detached from its MOC 
     [self setTaskObjectID:[inTask objectID]]; 
    } 
} 

Ở trên là hal đầu tiên f của vấn đề được giải quyết. Chúng ta cần phải tìm hiểu sự phụ thuộc trong các phần đáng ngờ của ứng dụng và loại bỏ chúng.

Có một số vấn đề khác nữa, công cụ -> phân bổ là nguồn tốt để tìm ra mô-đun nào thực sự giữ lại đối tượng được quản lý, đối tượng ngoại lệ sẽ có chi tiết về đối tượng được quản lý nào đang tạo sự cố, lọc kết quả đối tượng như hình dưới đây:

Instruments - Allocations

Chúng tôi đã thực hiện KVO trên một đối tượng quản lý. KVO giữ lại đối tượng được quản lý quan sát và do đó ngoại lệ được ném và nó trở lại dấu vết sẽ không được từ bên trong dự án của chúng tôi. Đây là rất khó để gỡ lỗi nhưng đoán công việc và theo dõi phân bổ của đối tượng và giữ lại chu kỳ phát hành chắc chắn sẽ giúp đỡ. Tôi đã loại bỏ phần quan sát KVO và tất cả bắt đầu hoạt động.

+0

+1 cho liên kết tài liệu của Apple – Martin

Các vấn đề liên quan