Проблемы миграции с UIManagedDocument

Я начал использовать CoreData в своем приложении после уроков Stanford CS193P, касающихся использования нового класса iOS 5 UIManagedDocument. Сам подход довольно прост, но я не могу понять, как бороться с модификациями моделей, которые я продолжаю делать. Вот как я создаю экземпляр своего объекта UIManagedDocument (внутри appDelegate, чтобы любой другой класс мог его использовать):

if (!self.database) {
    NSURL *url=[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    url = [url URLByAppendingPathComponent:@"AppName"];

    UIManagedDocument *doc = [[UIManagedDocument alloc] initWithFileURL:url];
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
    doc.persistentStoreOptions = options;
    self.database=doc;
    [doc release];
}

Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я немного изменяю свой.xcdatamodel, я не могу получить все содержимое, ранее сохраненное в документе, а также создать любой новый экземпляр. Фактически, это создает следующее исключение:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores.  It cannot perform a save operation.'

Я думал, что установка свойства "options" управляемого документа решит проблему, но, видимо, этого недостаточно. Кто-нибудь может помочь? Не могу найти другие вопросы, которые действительно соответствуют моим точным потребностям.

3 ответа

Перед тем, как изменить свою модель базовых данных, вы должны "Добавить версию модели".

1. Выберите исходный файл модели. (например, YourProject.xcdatamodel)

2. "Редактор" -> "Добавить версию модели...". Затем добавьте новую версию модели (например, 2.0)

3. Вы получите новый файл модели. (например, YourProject 2.0.xcdatamodel). Изменить это.

4. Измените текущую версию модели. Выберите верхний файл.xcdtatmodel -> "Вид" -> "Утилиты" -> "Показать инспектор файлов". Найдите тег "Versioned Core Data Model" и выберите правильную версию, которую вы хотите изменить.

Это также беспокоило меня долгое время. Надеюсь, что этот способ поможет вам ^^

Существует действительно простое решение вашей проблемы. Просто удалите приложение с симулятора или устройства (коснитесь значка приложения на несколько секунд и коснитесь крестика, который появляется, когда значки приложений начинают покачиваться). Таким образом, XCode обновляет UIManagedDocument вашего приложения.

Убедитесь, что вы не ошиблись при вводе NSDocumentDirectory в качестве NSDocumentationDirectory.

   NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];

NSDocumentDirectory прав!

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