Примечание: я подозреваю, что основная причина моих проблем в том, что Xcode4 неправильно обновляет частные хеши, которые он использует вместо номеров версий для отслеживания версии модели данных.Вероятно, я случайно что-то добавил, затем удалил, и это изменило хэш - моя оригинальная модель была настолько простой, что ее было легко сравнить на глаз, и не было никаких различий.
Также, в более общем плане, проблемаявляется то, что Xcode4 все еще не обрабатывает проекты CoreData должным образом - он создает модели CoreData как «версионные» по умолчанию (большое улучшение по сравнению с Xcode3, который был обречен всегда создавать бесполезные модели), но он все еще не делаетвыполните любую обработку изменений в модели - вы должны вручную не забыть обновить версию ДО ТОГО, как вы сохраните какие-либо изменения (иначе вся миграция вашего проекта завершится неудачей, навсегда, без выхода).
Кроме того, я не смог найти «правильного» решения, если что-то пойдет не так - слишком много недостающих фрагментов из библиотеки Apple Core Data.По сути: NSPersistentDocument является неполным, не поддерживается, насколько я могу судить.
В конце я выбрал следующий обходной путь BRUTAL: попросил всех старых версий вручную отредактировать хранилища CoreData, заявив, что онитекущая версия.
Это работает на 100%, потому что, в отличие от CoreData, мое приложение написано для интеллектуального исправления любых очевидных пропущенных данных при импорте.Это тривиально, но CoreData не позволяет вам сказать «да, я сделал это. Это нормально. Идите и откройте файл!»
- в старой версии: «сохранить как XML»
- дал им новый заголовок для копирования / вставки в начало файла.NB. Apple использует хеши вместо номеров версий, что делает это пугающим, хотя это не так.Я не понимаю, почему Apple игнорирует свою собственную систему версий и вместо этого использует хэши?
- в новой версии: откройте обновленный файл
- в новой версии: "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];
... просто подумал, что добавлю это для любого, кто попробует это - иначе ваш импорт будет работать нормально, но ваш экспорт отключитсяне включать фиксированные данные!