У меня есть слой данных на основе CoreData (с использованием хранилища данных SQLite), который я использую как в приложении iOS, так и на сервере, с которым общаются клиенты iOS. Уровень данных (код objc + модель coredata / определения сопоставления) компилируется в комплект iOS как обычно и компилируется в комплект Framework для использования в OSX.
Я бью кирпичную стену с миграцией по умолчанию с использованием картографических моделей.
На iOS работает нормально. При первом запуске приложения в симуляторе после добавления новой версии модели данных все данные переносятся при вызове addPersistentStoreWithType:configuration:...
в соответствии со стандартными документами Apple.
В OSX / PyObjC происходит сбой при Persistent store migration failed, missing mapping model
, т.е. по какой-то причине файл .cdm модели отображения не может быть найден в этом комплекте, даже если он присутствует.
Если вы вручную указываете модели source / dest / mapping, просматривая их в комплекте и затем вручную вызывая миграцию через NSMigrationManager, все работает нормально, например,
bundle = objc.loadBundle( "MyApp_OSX", globals(),
os.path.join( base, FRAMEWORK_FILENAME ) )
# URLs of input and output datastores
datastoreURL = NSURL.fileURLWithPath_( datadir + "/MyApp.hsdb" )
outURL = NSURL.fileURLWithPath_( datadir + "/MyApp-migrated.hsdb" )
# URLs of old and new version MOMs and the mapping model
momd = bundle.URLForResource_withExtension_( "MyApp.momd", None )
url1 = momd.URLByAppendingPathComponent_( "MyApp 21.mom" )
url2 = momd.URLByAppendingPathComponent_( "MyApp 22.mom" )
mappingURL = bundle.URLForResource_withExtension_( "Test.cdm", None )
# Old and new MOMs and the mapping model
mom1 = NSManagedObjectModel.alloc().initWithContentsOfURL_( url1 )
mom2 = NSManagedObjectModel.alloc().initWithContentsOfURL_( url2 )
mm = NSMappingModel.alloc().initWithContentsOfURL_( mappingURL )
# Do the migration
migration = NSMigrationManager.alloc().initWithSourceModel_destinationModel_(
mom1, mom2 )
migration.migrateStoreFromURL_type_options_withMappingModel_toDestinationURL_destinationType_destinationOptions_error_(
datastoreURL, NSSQLiteStoreType, None, mm, outURL, NSSQLiteStoreType, None, None )
На данный момент я понятия не имею, почему версия iOS способна найти модель отображения для успешной миграции хранилища данных, но версия OSX / PyObjC не может, несмотря на то, что в комплекте имеется модель отображения и модель отображения очевидно, действителен, так как он работает, когда вы вызываете его вручную.
Буду очень признателен за понимание того, как CoreData ищет допустимые / подходящие модели сопоставления в пакетах, которые могут помочь определить, как заставить эту работу работать на OSX.