Ну, во-первых, вы, кажется, знаете, что делаете, пережив 14 миграций Core Data и все.Так что я думаю, что вы должны быть в поиске какой-то глупой ошибки типа шлепка по лбу.
Убедитесь, что [NSBundle bundleForClass: [self class]]
возвращает ожидаемый пакет, который содержит каталог Contents/Resources/YourModelName.momd
, и что этот каталог содержит всенеобходимых .mom
файлов (по одному для каждой версии) и VersionInfo.plist
файла.Мои сборки также содержат файл .omo
только для последней версии.
Теперь я отвечу на ваш второй вопрос, который действительно может помочь вам ответить на ваш первый вопрос.
В этом * 1012В файле * вы найдете словарь с именем NSManagedObjectModel_VersionHashes
, который, в свою очередь, содержит под-словари, по одному ключу для каждой версии.Каждый под-словарь версии содержит ключ для каждого из имен и значений вашего объекта, который представляет собой 32-байтовый (256-битный) хэш атрибутов и отношений этого объекта в этой версии.Давайте назовем это хэшами модели .
Теперь откройте файл базы данных хранилища с помощью средства просмотра SQLite или инструмента командной строки sqlite3
.В этой базе данных рядом с одной таблицей для каждого объекта в модели вы увидите таблицу с именем Z_METADATA
с одной строкой и тремя столбцами.Значение столбца с именем Z_PLIST
вводится как двоичный объект двоичных данных.Скопируйте эти данные в файл, назовите его с расширением .plist
, дважды щелкните и, удивительно, он откроется в вашем любимом редакторе списков, потому что эти данные на самом деле представляют собой строку текста, представляющую список свойств Apple в формате XML.Значение его ключа NSStoreModelVersionHashes
фактически является под-словарем, который подобен подсловарю в файле VersionInfo.plist
.Давайте назовем это хешами магазина .Хэш 32-битной (256-битной) версии кодируется в Base64.(Существует 44 символа Base64. Поскольку каждый символ Base64 представляет 6 битов, 44 символа могут представлять до 44 * 6 = 264 бит.)
Наконец, чтобы ответить на ваш второй вопрос, storeMetadata
, переданный *На самом деле 1029 * - это Z_METADATA
из магазина, который содержит эти хешей .+[NSManagedObjectModel mergedModelFromBundles:forStoreMetadata:]
сравнивает эти хеши хранилища с хешами модели из каждой модели данных-кандидатов в переданном bundle
и возвращает модель, у которой хэши модели сопоставьте хэши магазина для всех сущностей, без каких-либо дополнительных несопоставимых сущностей с обеих сторон.
Таким образом, вы видите, что выполнять сравнение вручную довольно утомительно.Но, вероятно, во время изучения этих списков вы обнаружите этот удар по лбу.Если нет, дайте нам больше контекста относительно того кода, который вы вставили, и, возможно, кто-то может помочь.