领域迁移不起作用

时间:2016-01-04 19:20:34

标签: ios swift2 realm

    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/

有什么想法吗?

8 个答案:

答案 0 :(得分:12)

我遇到了类似的问题,即使我在didFinishLaunchingWithOptions

中添加了默认迁移代码,我的应用也会崩溃

问题在于我确实在我的第一个视图控制器中初始化了一个Realm实例作为类级属性。因此从我的第一个ViewController中删除该类级别的realm对象修复了该问题。

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 :(得分:3)

确保在application(application:didFinishLaunchingWithOptions:)中设置迁移配置之前,不要尝试实例化Realm()的实例。当它崩溃时检查执行堆栈以查找引发异常的实例。我有同样的错误,在我的情况下,我的一个视图控制器中的Realm实例在设置迁移块之前被实例化。

祝你好运

答案 2 :(得分:2)

只要您只在本地开发中,我建议您重置Realm数据库,而不是进行迁移。如果您已经使用其他架构发布了应用程序版本并希望保留用户数据,那么迁移是可行的方法。

您可以通过从模拟器或设备中删除应用程序来删除数据库。 或者,您可以在访问数据库之前使用NSFileManager删除Realm文件。

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

答案 3 :(得分:1)

我经常也会遇到同样的致命错误。 当您使用“主键”更改Realm对象时,通常会发生这种情况。 最快速,最简单的解决方法是从设备或模拟器中删除应用程序 - 然后再次运行您的项目。

答案 4 :(得分:1)

您确定已正确更新了schemaVersion吗?如果您在进行更改之前设置了schemaVersion: 1,则需要将其更改为2才能触发迁移。

答案 5 :(得分:1)

我也遇到了这个问题,尽管我在didFinishLaunchingWithOptions中添加了默认迁移代码,但我的应用仍会崩溃

正如这里已经提到的,问题在于我正在将我的第一个视图控制器中的Realm实例初始化为类级别的属性。

但是我不能仅仅删除该实例并将其放入viewDidLoad中,因为我需要在多个函数中使用它。

解决方案实际上是添加'lazy'关键字,因此可以在初始化之前完成迁移,正如我在此处找到的:https://www.selmanalpdundar.com/solution-of-realm-migration-error-code-10.html

import UIKit
import RealmSwift

class ViewController: UIViewController {
    lazy var realm = try! Realm() //added lazy and changed let to var
}

答案 6 :(得分:0)

我找到了最佳解决方案:

您需要在didFinishLaunchingWithOptions的{​​{1}}之前添加领域迁移代码

willFinishLaunchingWithOptions

答案 7 :(得分:0)

从iPhone删除应用程序,然后重新安装。效果很好。