2013-04-09 3 views
0

Я слежу за руководством Маркуса Зарры с точки зрения настройки моего приложения на основе документов. Пока все идет хорошо, но я пытаюсь реализовать Core Data Lightweight Migration, и я, похоже, попал в ловушку. Единственная разница между старой версией и новой версией модели - это атрибут NSString для одного из объектов.Легкая миграция

В NSDocument Я добавить следующий код:

- (BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)url ofType:(NSString *)fileType modelConfiguration:(NSString *)configuration storeOptions:(NSDictionary *)storeOptions error:(NSError **)error 
    { 
     NSMutableDictionary *newStoreOptions; 
     if (storeOptions == nil) { 
      newStoreOptions = [NSMutableDictionary dictionary]; 
     } 
     else { 
      newStoreOptions = [storeOptions mutableCopy]; 
     } 
     [newStoreOptions setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption]; 
     [newStoreOptions setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption]; 

     BOOL result = [super configurePersistentStoreCoordinatorForURL:url ofType:fileType modelConfiguration:configuration storeOptions:newStoreOptions error:error]; 
     NSLog(@"base url:%@ model:%@", [url baseURL], [self managedObjectModel]); 
     return result; 
    } 

Просто, чтобы увидеть, что происходит, я выводимый переменную ошибки, возвращаемый из

[super configurePersistentStoreCoordinatorForURL:url ofType:fileType modelConfiguration:configuration storeOptions:newStoreOptions error:error]; 

И это то, что я вернулся из Xcode:

NSUnderlyingError = "Error Domain=NSCocoaErrorDomain Code=512 \"The file couldn\U2019t be saved.\" UserInfo=0x104521930 {NSUnderlyingException=Error validating url for store}"; 
reason = "Can't add destination store"; 

Я видел пару сообщений о том, что некоторые пользователи имели это сообщение когда они пытаются читать/писать одновременно, но я не думаю, что попаду в эту категорию.

Кроме того, я не знаю, имеет ли значение это значение, но я настраиваю приложение на два контекста. Один из них - это корневой контекст, который записывает в persistentStore, а второй - это дочерний контекст, в котором происходит все действие из пользовательского интерфейса. Корневой контекст задается как родительский контекст дочернего элемента.

Спасибо!

Обновление Глупо мне ... Я думаю, что у меня есть частичное решение, но не знаю, как это будет работать на компьютерах пользователей. Поэтому, если я сниму флажок «Enable App Sandboxing» на вкладке «Сводка», все работает. Хотя это работает для меня, мне придется это сделать, когда я отправлю его в Mac App Store и не знаю, как это повлияет на пользователей.

+0

Какой URL-адрес вы сохраняете? На iOS вы не можете сохранить в основной комплект. Не уверен, как это работает на OS X, но вы можете взглянуть на это. –

+0

Спасибо Скотту. Приложение повторно открывает старый файл, который был сохранен с предыдущей версией модели. В процессе запуска этот метод выполняется. Поэтому я не спасу в комплекте (по крайней мере ... я не думаю, что это так). – schmudu

ответ

0

Просмотрите документ для configurePersistentStoreCoordinatorForURL:ofType:modelConfiguration:storeOptions:error, в частности параметр NSError **. Вы должны передать адрес NSError *, то есть &error в вашем случае (при условии, что вы определили NSError *error где-то в выпущенном коде). Но значение &error не определено по успеху. Используйте что-то вроде

if (!result) { 
    NSLog(@"%@", error.localizedFailureReason); 
    // fix it 
} 
Смежные вопросы