Миграция области не работает
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()
Это было помещено в приложение (application: didFinishLaunchingWithOptions:)
В моей тестовой программе я изменил поля в моем объекте. Я хотел бы удалить все в базе данных и перейти к новым типам полей. Я скопировал код из документации, но, похоже, ничего не делает. Я все еще получаю следующие ошибки:
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
Пока вы находитесь только в локальной разработке, я бы рекомендовал вместо reset вашу базу данных Realm вместо миграции. Миграции - это путь, если вы уже отправили версию своего приложения с другой схемой и хотите сохранить пользовательские данные.
Вы можете удалить базу данных, удалив приложение из симулятора или устройства.
В качестве альтернативы вы можете использовать NSFileManager
для удаления файла Realm перед доступом к базе данных.
let defaultPath = Realm.Configuration.defaultConfiguration.path!
try NSFileManager.defaultManager().removeItemAtPath(defaultPath)
Ответ 2
У меня была аналогичная проблема, с которой произошло мое приложение, несмотря на то, что я добавил код миграции по умолчанию в didFinishLaunchingWithOptions
Проблема заключалась в том, что я действительно инициализировал экземпляр Realm в моем контроллере представления first как свойство уровня класса. Поэтому удаление этого объекта класса уровня класса из моего первого 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
}
}
Вместо этого я создал объект внутри функции, которая ему нужна, и это лучший подход.
Ответ 3
Убедитесь, что вы не пытаетесь создать экземпляр Realm() перед настройкой миграции в application(application:didFinishLaunchingWithOptions:)
. Когда он сбой проверяет выполнение стека, чтобы найти, какой экземпляр вызвал исключение. У меня была такая же ошибка, в моем случае экземпляр Realm в одном из моих контроллеров представлений был создан до того, как был установлен блок миграции.
Удачи.
Ответ 4
Я часто получаю ту же фатальную ошибку.
Обычно это происходит, когда вы вносите изменения в объекты Realm с помощью "Первичных ключей".
Самое быстрое и простое решение - просто удалить приложение с устройства или симулятора, а затем снова запустить проект.
Ответ 5
Вы уверены, что правильно обновили свою схему? Если вы установили schemaVersion: 1
перед внесением изменений, вам нужно изменить его на 2
, чтобы миграция вызывалась.