Включить автоматическую облегченную миграцию основных данных в NSPersistentDocument - PullRequest
4 голосов
/ 16 мая 2011

ALM отлично. Но я не могу заставить его работать над проектом, который использует Core Data с NSDocument. Похоже, ALM по умолчанию отключен.

Fine. Для любого обычного проекта вы добавили бы две соответствующие опции в словарь в этой строке:

if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error])

... но эта строка не существует при использовании CD с NSD (NSPersistentDocument скрывает детали, и я не вижу, как вы можете их изменить).

Следующий метод, кажется, дает надежду:

configurePersistentStoreCoordinatorForURL:ofType:modelConfiguration:storeOptions:error:

... некоторые люди в списках рассылки (от 4+ лет назад) сообщают об успешном переопределении этого метода, изменении словаря опций и повторном вызове его в «super» Это не сработало для меня, к сожалению. Я бы посоветовал сначала попробовать, если у вас есть подобные проблемы, а затем вернуться сюда, если это все еще не работает :)

Ответы [ 2 ]

7 голосов
/ 07 июня 2011

Создавая новый проект Cored-Data-with-NSDocument с нуля, я попробовал подход, который изначально не работал, и на этот раз он работал нормально:

-(BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)url ofType:(NSString *)fileType modelConfiguration:(NSString *)configuration storeOptions:(NSDictionary *)storeOptions error:(NSError **)error
{
    NSMutableDictionary *newOptions = [NSMutableDictionary dictionaryWithDictionary:storeOptions];
    [newOptions setValue:@"YES" forKey:NSMigratePersistentStoresAutomaticallyOption];
    [newOptions setValue:@"TRUE" forKey:NSInferMappingModelAutomaticallyOption];

    return [super configurePersistentStoreCoordinatorForURL:url ofType:fileType modelConfiguration:configuration storeOptions:newOptions error:error];
}
1 голос
/ 30 мая 2011

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

Также, в более общем плане, проблемаявляется то, что Xcode4 все еще не обрабатывает проекты CoreData должным образом - он создает модели CoreData как «версионные» по умолчанию (большое улучшение по сравнению с Xcode3, который был обречен всегда создавать бесполезные модели), но он все еще не делаетвыполните любую обработку изменений в модели - вы должны вручную не забыть обновить версию ДО ТОГО, как вы сохраните какие-либо изменения (иначе вся миграция вашего проекта завершится неудачей, навсегда, без выхода).

Кроме того, я не смог найти «правильного» решения, если что-то пойдет не так - слишком много недостающих фрагментов из библиотеки Apple Core Data.По сути: NSPersistentDocument является неполным, не поддерживается, насколько я могу судить.


В конце я выбрал следующий обходной путь BRUTAL: попросил всех старых версий вручную отредактировать хранилища CoreData, заявив, что онитекущая версия.

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

  1. в старой версии: «сохранить как XML»
  2. дал им новый заголовок для копирования / вставки в начало файла.NB. Apple использует хеши вместо номеров версий, что делает это пугающим, хотя это не так.Я не понимаю, почему Apple игнорирует свою собственную систему версий и вместо этого использует хэши?
  3. в новой версии: откройте обновленный файл
  4. в новой версии: "save"

... и поскольку я переопределяю метод NSManagedObject:

-awakeFromInsert

и исправляю любые неверные / отсутствующие данные, шаги 3 и 4, описанные выше, «автоматически» обновляютdata.

Я знаю, что "правильным" способом было бы создать модель отображения, но это огромная избыточность для большинства ситуаций ... и Apple отказывалась загружать старые данные в первую очередь.Итак, Core Data просто отказывалась даже разрешить мне исправлять данные - хотя мой код успешно это делал.

(все старые проекты были импортированы и экспортированы правильно - без проблем)

ИМХО: CoreData действительно нуждается в некоторой переработке на стороне Apple, чтобы исправить все крайние случаи, о которых они не думали впервые.


NB: быстрое предупреждение: убедитесь, что вы НЕ меняетелюбые переменные CoreData внутри awakeFromFetch - Apple временно отключает отслеживание изменений перед вызовом этого метода (что отчасти смешно - это делает метод несовместимым с поведением всех других методов "awakeFrom *").

Совет Apple:внутри awakeFromFetch решите, что вы собираетесь изменить, затем упакуйте его и используйте что-то вроде этого:

[self executeSelector: @selector (myAwakeFromFetchFixItemX :) withObject: X afterDelay: 0.01];

... просто подумал, что добавлю это для любого, кто попробует это - иначе ваш импорт будет работать нормально, но ваш экспорт отключитсяне включать фиксированные данные!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...