2011-12-03 11 views
7

Używam UIManagedDocument do zarządzania moimi danymi. Tworzę model i używam go, i wszystko wydaje się działać, ale moje zmiany nie są zapisywane z powrotem do sklepu SQLite.UIManagedDocument nie zapisuje

Dokumentacja dla UIManagedDocument mówi, że autozapis powinien dbać o utrzymanie danych w bazie danych, ale to się nie dzieje.

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

Spowoduje to pobranie obiektu, który chcę dodać (i powiedzie się).

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

Dodaje element do kolekcji przedmiotów w innym obiekcie, a następnie informuje dokument, że dokonałem zmian.

Spodziewam się, że niedługo potem zobaczę zmianę zapisaną w magazynie danych podstawowych, ale oglądając w Instrumentach, widzę, że to się nigdy nie zdarza.

Kolekcja przedmiotów jest NSOrderedSet, a ze względu na komentarze do tego elementu:

Exception thrown in NSOrderedSet generated accessors

dodałem takie addItemsObject: do obiektu, który przechowuje kolekcję:

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

Być może coś idzie nie tak z tym, że Core Data otrzymuje informację, że kolekcja przedmiotów się zmieniła, ale nie wiem, jak to zrobić.

+0

Dzięki Instruments widzę, że dane są zapisywane w pamięci podręcznej danych podstawowych. Ale nie pojawia się w narzędziu Core Data Saves, a jeśli zabiję i zrestartuję aplikację, moje zmiany znikną. – stevex

+3

Znalazłem mój problem. Okazuje się, że wystąpił błąd związany z obiektem, który próbowałem dodać - straciłem wymaganą właściwość - i bez nadpisania handleError nic nie wskazuje na to, że wystąpił problem. Blogował o tym tutaj: http://blog.stevex.net/2011/12/uimanageddocument-autosave-troubleshooting/ – stevex

Odpowiedz

9

Znalazłem mój problem. Okazuje się, że wystąpił błąd związany z obiektem, który próbowałem dodać - straciłem wymaganą właściwość - i bez nadpisania handleError nic nie wskazuje na to, że wystąpił problem.

blogu o tym tutaj: http://blog.stevex.net/2011/12/uimanageddocument-autosave-troubleshooting/

+1

jest to rewelacyjne odkrycie - fakt, że CoreData w wielu przypadkach pozwala na utrwalenie obiektów w pamięci, ale nie zapis na dysku może być czasami bardzo * mylący, a poprawiona przez ciebie poprawa jest świetna. – NSTJ

+0

Podniosłem odpowiedź, która podsumowuje twój link w przypadku przyszłej awarii łącza :) – olynoise

1

W moim sposobie gdzie pobrać dane z serwera, po raz pierwszy tworzyć podmioty i potem ja nazywam te dwie metody, aby zapisać zmiany w dokumencie natychmiast:

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

Kluczowe uwielbiacie brać/podsumowanie od użytkownika @ stevex linku:

Upewnij się, aby zadzwonić -updateChangeCount metodę UIManagedDocument lub wywołać zmianę, która jest zarejestrowana na dokument undoManager. W przeciwnym razie dokument nie musi niczego zapisywać.

Ponadto, podklasowanie niektórych kluczowych metod pozwoli ci zobaczyć, kiedy nastąpi automatyczne zapisywanie i czy występują błędy.

- (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); 
} 
Powiązane problemy