CoreData не может найти модель сопоставления в пакете платформы OSX, но прекрасно работает в iOS - PullRequest
1 голос
/ 07 сентября 2010

У меня есть слой данных на основе 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.

1 Ответ

1 голос
/ 07 сентября 2010

Я бы заподозрил проблему с разрешениями, потому что это одна из областей, где iOS и Какао различаются, но поскольку работает жестко закодированный URL, это не так.Это похоже на проблему NSBundle.

Я бы начал с использования стандартной формы URLForResource:withExtension: и разделил имя и расширение.Возможно, это не причина, но мост не идеален, и вы хотите устранить любые возможные ошибки источников.

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

...