UIManagedDocument не сохраняется - PullRequest
       41

UIManagedDocument не сохраняется

7 голосов
/ 03 декабря 2011

Я использую UIManagedDocument для управления своими данными. Я создаю модель и использую ее, и все, кажется, работает, но мои изменения не записываются обратно в хранилище SQLite.

В документации для UIManagedDocument говорится, что автосохранение должно заботиться о сохранении данных в базе данных, но, похоже, этого не происходит.

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

Выбирает объект, который я хочу добавить (и успешно).

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

Это добавляет элемент в коллекцию элементов в другом объекте, а затем сообщает документу, что я сделал изменения.

Вскоре после этого я ожидал бы, что изменения будут записаны в хранилище Core Data, но, наблюдая за инструментами, я вижу, что этого никогда не произойдет.

Коллекция элементов является набором NSOrderedSet, и из-за комментариев к этому элементу:

Исключение, создаваемое в сгенерированных NSOrderedSet средствах доступа

Я добавил addItemsObject: к объекту, который содержит коллекцию:

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

Возможно, что-то идет не так, когда Core Data получает информацию о том, что коллекция предметов изменилась, но я не понимаю, как.

Ответы [ 3 ]

9 голосов
/ 21 августа 2012

Я нашел свою проблему. Оказывается, у меня была ошибка с объектом, который я пытался добавить - я пропустил обязательное свойство - и без переопределения handleError нет никаких признаков того, что есть проблема.

Блог об этом здесь: http://blog.stevex.net/2011/12/uimanageddocument-autosave-troubleshooting/

1 голос
/ 26 ноября 2013

В моем методе, где я получаю данные с сервера, я сначала создаю сущности, а затем вызываю эти два метода для немедленного сохранения изменений в документе:

[self.document updateChangeCount:UIDocumentChangeDone];
[self.document savePresentedItemChangesWithCompletionHandler:^(NSError *errorOrNil) {
            ...
        }];
0 голосов
/ 24 октября 2017

Вывод ключа / резюме по ссылке @ stevex:

Обязательно вызовите метод -updateChangeCount UIManagedDocument или запустите изменение, зарегистрированное в документе undoManager. В противном случае документ не считает необходимым что-либо сохранять.

Кроме того, подклассы некоторых ключевых методов позволят вам увидеть, когда происходит автосохранение и есть ли ошибки.

- (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);
}
...