2016-01-04 4 views
11
let config = Realm.Configuration(
     // Set the new schema version. This must be greater than the previously used 
     // version (if you've never set a schema version before, the version is 0). 
     schemaVersion: 1, 

     // Set the block which will be called automatically when opening a Realm with 
     // a schema version lower than the one set above 
     migrationBlock: { migration, oldSchemaVersion in 
      // We haven’t migrated anything yet, so oldSchemaVersion == 0 
      if (oldSchemaVersion < 1) { 
       // Nothing to do! 
       // Realm will automatically detect new properties and removed properties 
       // And will update the schema on disk automatically 
      } 
    }) 

    // Tell Realm to use this new configuration object for the default Realm 
    Realm.Configuration.defaultConfiguration = config 

    // Now that we've told Realm how to handle the schema change, opening the file 
    // will automatically perform the migration 
    let realm = try! Realm() 

Это была помещена в приложении (приложение: didFinishLaunchingWithOptions :)Realm миграции не работает

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

fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=0 "Migration is required due to the following errors: 
- Property types for 'unit' property do not match. Old type 'string', new type 'int' 
- Property 'reps' has been added to latest object model." UserInfo={NSLocalizedDescription=Migration is required due to the following errors: 
- Property types for 'unit' property do not match. Old type 'string', new type 'int' 
- Property 'reps' has been added to latest object model.}: file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-700.1.101.15/src/swift/stdlib/public/core/ 

Любые идеи?

+1

'schemaVersion' должно быть больше, чем ранее использовавшаяся версия. Кажется, текущая версия схемы может быть больше 1? Можете ли вы попытаться передать большее число в параметр schemaVersion? –

ответ

3

До тех пор, пока вы находитесь только в локальной разработке, я бы рекомендовал сбросить базу данных Realm вместо миграции. Миграции - это путь, если вы уже отправили версию своего приложения с другой схемой и хотите сохранить пользовательские данные.

Вы можете удалить базу данных, удалив приложение из симулятора или устройства. В качестве альтернативы вы можете использовать NSFileManager для удаления файла Realm перед доступом к базе данных.

let defaultPath = Realm.Configuration.defaultConfiguration.path! 
try NSFileManager.defaultManager().removeItemAtPath(defaultPath) 
+4

Это не касается реальной проблемы, а просто рекомендует использовать миграции для производственных приложений. – codepushr

1

Я часто получаю такую ​​же фатальную ошибку. Обычно это происходит, когда вы вносите изменения в объекты Realm с помощью «Первичных ключей». Самое быстрое и простое решение - просто удалить приложение с устройства или симулятора, а затем снова запустить проект.

+0

Как насчет того, когда ваше приложение находится на устройстве удаленного пользователя? Что вы делаете тогда? – lwdthe1

0

Вы уверены, что правильно обновили свою схему? Если вы установили schemaVersion: 1 перед внесением изменений, вам необходимо изменить его на 2, чтобы перейти к триггеру.

2

Убедитесь, что вы не пытаетесь создать экземпляр Realm() перед настройкой миграции в application(application:didFinishLaunchingWithOptions:). Когда он сбой проверяет выполнение стека, чтобы найти, какой экземпляр вызвал исключение. У меня была такая же ошибка, в моем случае экземпляр Realm в одном из моих контроллеров представлений был создан до того, как был установлен блок миграции.

Успехов

9

У меня была аналогичная проблема происходит, когда мое приложение будет врезаться, несмотря на то, что я добавил код миграции по умолчанию в didFinishLaunchingWithOptions

Проблема заключалась в том, что я действительно инициализирует экземпляр Realm в мой первый просмотр контроллера как свойство уровня. Поэтому удаление этого объекта класса уровня класса из моего первого ViewController устранило проблему.

import UIKit 
import RealmSwift 

class ViewController: UIViewController{ 
    let db = try! Realm() // Removing this solved my issue 

    func doSomething(){ 
    let db = try! Realm() // Placed this here instead 
    } 
} 

Я вместо этого создал объект внутри функции, которая ему нужна, что является лучшим подходом в любом случае.

+1

Можете подтвердить, что это была проблема, с которой я столкнулся, спасибо! – Luis

+1

Я тоже могу это подтвердить – lwdthe1

+1

Это спасло меня! Я создавал область в моем диспетчере контроля запуска. Я переместил экземпляр в viewDidAppear, и теперь моя миграция запущена! Спасибо –

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