2015-02-05 1 views
1

Я добавил следующие два свойства в свой RLMObject, и я не могу заставить его обновить, следуя документам. Вот мои свойства:Невозможно перейти на новую схему с обновленными свойствами из-за того, что блок RLMRealm.setSchemaVersion не попал

dynamic var firstName = "" 
dynamic var lastName = "" 

Вот моя миграция логика (в моем AppDelegate, содержащемся в didFinishLaunchingWithOptions, который, как я понимаю, должен добавить эти свойства в файл царств:

RLMRealm.setSchemaVersion(1, forRealmAtPath: RLMRealm.defaultRealmPath(), withMigrationBlock: { migration, oldSchemaVersion in 

     if oldSchemaVersion < 1 { 

     } 

}) 

и за исключение того, отбрасывается:

'RLMException', reason: 'Migration is required for object type 'FilteredAccount' due to the following errors: 
- Property 'firstName' has been added to latest object model. 
- Property 'lastName' has been added to latest object model.' 

Когда я устанавливаю точки останова в этом блоке, они не попали Мои сбои приложений в верхней части AppDelegate и никогда е. xecutes код миграции. Когда я удаляю эти свойства, приложение открывается просто отлично. Он также исправляется, если я удаляю всю область, но, очевидно, это неэффективно делать каждый раз, когда я меняю модель данных.

Любая помощь будет принята с благодарностью. Спасибо!

ответ

1

Кажется, что вы открываете царство перед вызовом RLMRealm.setSchemaVersion, что, безусловно, вызовет это исключение.

Мы можем проверить это, если вы поделились полным содержимым своего didFinishLaunchingWithOptions (предполагая, что именно там вы создали свою область).

Редактировать

Поскольку вы добавили два свойства вашего RLMObject подкласса и Realm еще не поддерживают дополнительные строковые свойства, вам нужно присвоить значение для firstName и lastName всех существующих FilteredAccount объектов внутри блока миграции, например, так:

RLMRealm.setSchemaVersion(1, forRealmAtPath: RLMRealm.defaultRealmPath(), withMigrationBlock: { migration, oldSchemaVersion in 

     if oldSchemaVersion < 1 { 
       migration.enumerateObjects(FilteredAccount.className()) { oldObject, newObject in 
        newObject["firstName"] = "" 
        newObject["lastName"] = "" 
       } 
     } 

}) 
+0

Я не установить мое царство в 'didFinishLaunchingWithOptions', который я уверен, что мой вопрос. Я использую 'defaultRealm' для всех своих вызовов в области, поэтому у меня нет никакого кода настройки, кроме добавления объектов и их соответствующих свойств в' defaultRealm'. Есть ли какой-то установочный код, который я должен помещать туда, хотя я не использую другое царство? – mattchue

+0

Кроме того, в разделе 'didFinishLaunchingWithOptions' размещен только соответствующий код в царстве. Единственный другой материал в нем - некоторый код установки окна. – mattchue

+0

Спасибо! Приятно видеть, что вы и ваша команда отвечаете на вопросы, очень круто. – mattchue

 Смежные вопросы

  • Нет связанных вопросов^_^