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

Я использую 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 информируют об изменении коллекции элементов, но я не понимаю, как это сделать.


person stevex    schedule 03.12.2011    source источник
comment
С помощью инструментов я вижу, что данные записываются в кэш основных данных. Но он не отображается в инструменте Core Data Saves, и если я убью и перезапущу приложение, мои изменения исчезнут.   -  person stevex    schedule 03.12.2011
comment
Я нашел свою проблему. Оказывается, у меня была ошибка с объектом, который я пытался добавить — я пропустил необходимое свойство — и без переопределения handleError нет никаких признаков того, что есть проблема. Написал об этом в блоге здесь: blog.stevex.net/2011/12/   -  person stevex    schedule 04.12.2011


Ответы (3)


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

Об этом написано в блоге здесь: http://blog.stevex.net/2011/12/uimanageddocument-autosave-troubleshooting/

person stevex    schedule 21.08.2012
comment
это потрясающая находка - тот факт, что CoreData во многих случаях позволяет сохранять объекты в памяти, но не сохранять на диск, может иногда чрезвычайно вводить в заблуждение, и исправление, которое вы дали, великолепно. - person NSTJ; 09.03.2013
comment
Я разместил ответ, который резюмирует вашу ссылку на случай сбоя ссылки в будущем :) - person olynoise; 24.10.2017

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

[self.document updateChangeCount:UIDocumentChangeDone];
[self.document savePresentedItemChangesWithCompletionHandler:^(NSError *errorOrNil) {
            ...
        }];
person carmen_munich    schedule 26.11.2013

Основные выводы / резюме по ссылке @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);
}
person olynoise    schedule 23.10.2017