2011-12-03 13 views
7

Tôi đang sử dụng UIManagedDocument để quản lý dữ liệu của mình. Tôi tạo ra các mô hình và sử dụng nó, và tất cả mọi thứ có vẻ là làm việc, nhưng những thay đổi của tôi không được viết trở lại cửa hàng SQLite.UIManagedTài liệu không lưu

Tài liệu dành cho UIManagedDocument cho biết rằng lưu trữ tự động nên lưu giữ dữ liệu vào cơ sở dữ liệu, nhưng điều đó dường như không xảy ra.

NSManagedObjectContext *moc = [doc managedObjectContext]; 
    NSError *error = nil; 
    MyItem *itemToAdd = (MyItems *)[moc existingObjectWithID:(NSManagedObjectID *)itemsID error:&error]; 

Điều này tìm nạp đối tượng tôi muốn thêm (và thành công).

[itemContainer addItemsObject:itemToAdd]; 
    [doc updateChangeCount:UIDocumentChangeDone]; 

Thao tác này thêm mục vào bộ sưu tập các mục trong đối tượng khác và sau đó cho tài liệu biết rằng tôi đã thực hiện thay đổi.

Tôi mong đợi một thời gian ngắn sau này để xem thay đổi được ghi vào kho dữ liệu Core, nhưng xem trong Dụng cụ, tôi thấy rằng nó không bao giờ xảy ra.

Bộ sưu tập các mặt hàng là một NSOrderedSet, và vì ý kiến ​​về mục này:

Exception thrown in NSOrderedSet generated accessors

Tôi đã thêm một addItemsObject: đến đối tượng chứa bộ sưu tập:

- (void)addItemsObject:(MyItem *)value 
{ 
    NSMutableOrderedSet* tempSet = [NSMutableOrderedSet orderedSetWithOrderedSet:self.items]; 
    [tempSet addObject:value]; 
    self.items = tempSet; 
} 

Có lẽ đã xảy ra sự cố với dữ liệu cốt lõi được thông báo rằng các bộ sưu tập các mặt hàng đã thay đổi, nhưng tôi không thấy như thế nào.

+0

Với công cụ, tôi có thể thấy dữ liệu đó đang được ghi vào Cache dữ liệu lõi. Nhưng nó không hiển thị trong công cụ Lưu dữ liệu cốt lõi và nếu tôi giết và khởi động lại ứng dụng, các thay đổi của tôi sẽ biến mất. – stevex

+3

Tôi đã tìm thấy sự cố của mình. Hóa ra tôi đã gặp lỗi với đối tượng mà tôi đang cố gắng thêm vào - tôi đã bỏ lỡ một thuộc tính bắt buộc - và không có handleError ghi đè nào thì không có dấu hiệu nào cho thấy có vấn đề. Viết blog về nó ở đây: http://blog.stevex.net/2011/12/uimanageddocument-autosave-troubleshooting/ – stevex

Trả lời

9

Tôi đã tìm thấy sự cố của mình. Hóa ra tôi đã gặp lỗi với đối tượng mà tôi đang cố gắng thêm vào - tôi đã bỏ lỡ một thuộc tính bắt buộc - và không có handleError ghi đè nào thì không có dấu hiệu nào cho thấy có vấn đề.

viết blog về nó ở đây: http://blog.stevex.net/2011/12/uimanageddocument-autosave-troubleshooting/

+1

đây là một tìm kiếm tuyệt vời - thực tế là CoreData trong nhiều trường hợp sẽ cho phép các đối tượng được duy trì trong bộ nhớ, nhưng không lưu vào đĩa có thể được * cực kỳ * gây hiểu lầm ở lần, và sửa chữa bạn đã đưa ra là rất tốt. – NSTJ

+0

Tôi đưa ra một câu trả lời tóm tắt liên kết của bạn trong trường hợp thất bại liên kết trong tương lai :) – olynoise

1

Trong phương pháp của tôi, nơi tôi lấy dữ liệu từ máy chủ, đầu tiên tôi tạo ra các thực thể và sau đó tôi gọi hai phương pháp này để lưu các thay đổi đối với tài liệu ngay lập tức:

[self.document updateChangeCount:UIDocumentChangeDone]; 
[self.document savePresentedItemChangesWithCompletionHandler:^(NSError *errorOrNil) { 
      ... 
     }]; 
0

aways mất chính/bản tóm tắt từ liên kết @ stevex của:

Hãy chắc chắn để gọi phương thức -updateChangeCount của UIManagedDocument hoặc kích hoạt một sự thay đổi đó được đăng ký với tài liệu của undoManager. Nếu không, tài liệu không nghĩ rằng nó cần phải lưu bất cứ điều gì.

Ngoài ra, việc phân lớp một số phương thức chính sẽ cho phép bạn xem khi nào xảy ra tự động lưu và nếu có lỗi.

- (id)contentsForType:(NSString *)typeName error:(NSError * _Nullable __autoreleasing *)outError { 

    id retVal = [super contentsForType:typeName error:outError]; 
    NSLog(@"Autosaving document. contentsForType at fileURL %@ error %@", self.fileURL, *outError); 
    return retVal; 
} 


- (void)handleError:(NSError *)error userInteractionPermitted:(BOOL)userInteractionPermitted { 
    [super handleError:error userInteractionPermitted:userInteractionPermitted]; 
    NSLog(@"ManagedDocument handleError: %@ %@", error.localizedDescription, error.userInfo); 
}