Проблемы миграции с 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 прав!