2011-10-22 28 views
7

Hiện tại tất cả các lần lưu của tôi sẽ lưu vào bộ nhớ nhưng không được ghi ra đĩa (iOS). Ứng dụng của tôi được thiết lập với UITableView với Chế độ xem phương thức bổ sung được trình bày trong phần này để tạo nội dung, khi người dùng hoàn tất việc tạo nội dung và nút lưu được nhấp vào mục mới (lớp NSManagedObject được tạo bởi Mô hình CoreData của tôi). và nó được điền đầy đủ ngay lập tức sau này tôi cố gắng lưu nó vào đĩa và một thông báo lỗi được tạo ra với cùng một ID đối tượng ngoại trừ các trường là không. Tuy nhiên, giữa các phương thức UITableViews của tôi - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath được gọi là đang ghi nhật ký @"CanEdit".CoreData 1570 Mã lỗi

Có ai có thể xem tôi đang làm gì sai không?

Đây là mã

 NSLog(@"newItem %@", newItem); 
    NSError *error; 
    if (![newItem.managedObjectContext save:&error]) { 
     // Handle the error. 
     NSLog(@"%@", error); 
    } 

    if (editItem) { 
     [self.navigationController popViewControllerAnimated:YES]; 
    } else { 
     [self dismissModalViewControllerAnimated:YES];    
    } 

Và đây là lỗi của tôi

2011-10-22 15:24:46.322 App[42115:fb03] newItem <Item: 0x81a4a30> (entity: Item; id: 0x81a0ab0 <x-coredata:///Item/t7F2B54D2-0DCC-4530-88D5-900BE25C7DC23> ; data: { 
    containedIn = "0x6e89010 <x-coredata:///Item/t7F2B54D2-0DCC-4530-88D5-900BE25C7DC22>"; 
    contains =  (
    ); 
    content = a; 
    dateLastUsed = nil; 
    depth = 0; 
    encrypted = 0; 
    favorite = 0; 
    favoritePosition = nil; 
    folder = 0; 
    fullPath = "^Templates^Add Title"; 
    name = a; 
    sortPosition = 0; 
}) 
2011-10-22 15:24:46.323 App[42115:fb03] CanEdit 
2011-10-22 15:24:46.326 App[42115:fb03] Error Domain=NSCocoaErrorDomain Code=1570 "The operation couldn’t be completed. (Cocoa error 1570.)" UserInfo=0x6ecc490  
{NSValidationErrorObject=<Item: 0x6e88fb0> (entity: Item; id: 0x6e89010 <x-coredata:///Item/t7F2B54D2-0DCC-4530-88D5-900BE25C7DC22> ; data: { 
    containedIn = nil; 
    contains =  (
     "0x81a0ab0 <x-coredata:///Item/t7F2B54D2-0DCC-4530-88D5-900BE25C7DC23>" 
    ); 
    content = nil; 
    dateLastUsed = nil; 
    depth = 0; 
    encrypted = 0; 
    favorite = 0; 
    favoritePosition = nil; 
    folder = 1; 
    fullPath = "^Templates^"; 
    name = Templates; 
    sortPosition = 0; 
}), NSValidationErrorKey=content, NSLocalizedDescription=The operation couldn’t be completed. (Cocoa error 1570.)} 
+0

bản sao có thể có của [Lỗi dữ liệu lõi của iPhone chưa được giải quyết trong khi lưu] (http://stackoverflow.com/questions/1283960/iphone-core-data-unresolved-error-while-saving) – millimoose

+0

Tôi thấy rằng trước đó, tôi biết lỗi này là do một trường bắt buộc không được thiết lập nhưng câu hỏi của tôi là tại sao nó đi từ được thiết lập để không được thiết lập ngay lập tức sau đó? – xizor

+0

Thông báo lỗi là dành cho một thực thể khác ('0x81a0ab0') so với thông báo lỗi bạn đang ghi (' 0x6e89010') và có vẻ như thông báo lỗi có chứa thông báo lỗi khác. Core Data có hỗ trợ tầng không? Nếu có, điều đó có nghĩa là bạn đang thực sự tiết kiệm hai đối tượng với một cuộc gọi, và các thuộc tính của đối tượng container là không. – millimoose

Trả lời

16

Vấn đề là bạn có một MO trong bối cảnh của bạn mà đã đòi hỏi các lĩnh vực thiết lập để nil. Cụ thể, điều này nói rằng NSValidationErrorKey=content trong đó NSValidationErrorObject trước là in ra dưới dạng không.

Hoặc bạn có lỗi logic trong đó các giá trị của bạn không được đặt trong MO đúng cách hoặc bạn nên thay đổi mô hình của mình để tạo trường đó tùy chọn.

+1

Cảm ơn bạn, tôi phát hiện ra rằng đó là những gì mã lỗi có nghĩa là câu hỏi duy nhất là tại sao đối tượng của tôi thay đổi từ content = a và name = a trong log đầu tiên thành content = nil và name = nil log của lỗi và chúng xuất hiện ngay sau mỗi khác. Tôi đang thiết lập chúng với newItem.name = @ "text here" - đây có phải là cách không chính xác không? – xizor

+1

Đó là chính xác. Có vẻ như bạn có thể có một đối tượng khác đang được tạo không được điền chính xác. Kiểm tra kỹ xem bạn có đang tạo số đối tượng bạn đang mong đợi hay không. Đặt điểm ngắt trong phương thức init của lớp con. – logancautrell

+0

Cảm ơn, đó là vấn đề tôi vô tình tạo ra một đối tượng khác. – xizor

0

Từ đầu ra lỗi ở trên, bạn có thể thấy có hai đối tượng khác nhau, một với địa chỉ 0x6e89010 chứa dữ liệu của bạn, một khác có địa chỉ 0x6e88fb0 trong trường bắt buộc là nil.

Nguồn của lỗi này phải được chứa trong mã mà bạn không đăng.

Tôi đề nghị để tránh những loại vấn đề là làm theo các mẫu thiết kế sau đó cũng được sử dụng trong bản demo của Apple:

  • Vượt qua bối cảnh đối tượng được quản lý như một tài sản để điều khiển xem phương thức. Đó là khuyến khích chỉ có một bối cảnh đối tượng được quản lý.
  • Tạo đối tượng được quản lý mới khi bộ điều khiển đầu vào bắt đầu bằng [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:self.managedObjectContext];
  • Khi người dùng nhập dữ liệu, hãy gán thuộc tính/thuộc tính cho đối tượng mới của bạn ngay lập tức.
  • Khi người dùng nhấn "Save", lưu các thay đổi với [self.managedObjectContext save:&error];
  • Nếu người dùng hủy bỏ, xóa các đối tượng từ các bối cảnh với [self.managedObjectContext deleteObject:insertedObject];

này rất hiệu quả và có xu hướng tránh các lỗi đối tượng đi lạc.

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