autosavesInPlace приводит к сбою сохранения нового документа

У меня есть приложение на основе NSPersistentDocument, которое не может сохранить новый документ, когда autosavesInPlace настроен на возврат YES, вернуть NO и проблема исчезает.

  • Я создаю новый документ
  • Внести некоторые изменения
  • Сохраните его NSSaveAsOperation имя документа и URL-адрес изменяются, и все выглядит хорошо, но при следующем сохранении произойдет очень информативное

NSPersistentStoreSaveError = 134030, // unclassified save error - something we depend on returned an error

Это происходит только тогда, когда документ пытается выполнить сохранение после NSSaveAsOperation, Любой другой тип сохранения будет работать нормально, как при изменении существующего документа. Интересным эффектом является то, что если я не изменю имя или местоположение, я не получу эту проблему либо.

Я получаю исключение следа

кадр № 0: 0x00007fff988143c5 libobjc.A.dylibobjc_exception_throw frame #1: 0x00007fff94c5f5f9 CoreData- [NSPersistentStore (_NSInternalMethods) _preflightCrossCheck] + 697 кадра № 2: 0x00007fff94c3198b CoreData-[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 603 frame #3: 0x00007fff94c5aa98 CoreData- [NSManagedObjectContext save:] + 456 кадр № 4: 0x00007fff91baa101 AppKit-[NSPersistentDocument writeToURL:ofType:forSaveOperation:originalContentsURL:error:] + 3743 frame #5: 0x0000000100002de7 ZZZZ- [ZZZZDocument writeToURL: ofType: forSaveOperation: originalContentsURL: error:] + 135 при ZZZZDocument.m:209 кадров # 6: 0x00007fff91baabc7 AppKit-[NSPersistentDocument writeSafelyToURL:ofType:forSaveOperation:error:] + 611 frame #7: 0x0000000100002ea3 ZZZZ- [ZZZZDocument writeSafelyToURL: ofType: forSaveOperation: ошибка:] + 115 при ZZZZDocument.m:223

есть идеи?

1 ответ

Невозможно распаковать файл данных ядра

В случае, если вы пытаетесь поймать NSSaveAsOperation и выполнить миграцию в постоянном хранилище для этого перечисления при построении ...-journal файл не будет создан как вне песочницы.

-(void)saveToURL:(NSURL *)url ofType:(NSString *)typeName forSaveOperation:(NSSaveOperationType)saveOperation completionHandler:(void (^)(NSError *))completionHandler
{
    NSLog(@" save op = %ld to %@ ",saveOperation,url);
    NSURL *targeturl = url;

    if(saveOperation == NSSaveAsOperation)
    {
        //migrate pstore
        NSPersistentStore *store = [self.managedObjectContext.persistentStoreCoordinator.persistentStores lastObject];
        if (store)
        {
            NSMutableDictionary *opts = [NSMutableDictionary dictionary];
            [opts setValue:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];
            [opts setValue:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];

            NSError *error = NULL;

            NSPersistentStore *newstore =  [self.managedObjectContext.persistentStoreCoordinator migratePersistentStore:store toURL:url options:opts withType:store.type error:&error];

            if(newstore == nil)
            {
                NSLog(@"migration error %@",[error localizedDescription]);
            }

            self.fileURL = url;


        }


    }

    [super saveToURL:targeturl ofType:typeName forSaveOperation:saveOperation completionHandler:completionHandler];
}

Таким образом, нам нужно обернуть файл в пакет / папку, что нетривиально, используя NSPersistentDocument фреймворк.

Вот ждем NSManagedDocument (Это хорошо API)

Другие вопросы по тегам