0

我正在尝试使用一种记录在案的迁移领域数据库和设置模式版本的方法。我正在使用的代码类型是:

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

这似乎是非常标准的代码,并且看起来被其他人使用。但是,似乎让我感到困惑的是我在初始化 Realm 实例的地方,这导致架构设置无法设置或持续存在。

我正在努力的是在哪里设置以下代码:

let uiRealm = try! Realm()
  • 如果我把它放在@UIApplicationMain 上方的 AppDelegate 的顶部,它初始化得太早了
  • 如果我创建一个控制器文件,我打算在迁移后调用一个函数,并将初始化程序放在它仍然不起作用的顶部
  • 如果我将它放在 ViewController 的类中,如下面的代码所示,则会收到错误 Instance member uiRealm cannot be used on type XYZViewController

    import UIKit
    import RealmSwift
    
    class XYZViewController: UITableViewController,UIPickerViewDataSource,UIPickerViewDelegate {
    
        let uiRealm = try! Realm()
        var scenarios = uiRealm.objects(Scenario).filter("isActive = true ")
    
    }
    

所以我的问题是:是否有关于在哪里初始化以及如何最好地迁移的最佳实践。

4

1 回答 1

1

Configuration在调用代码的任何其他部分之前,您需要确保已将对象设置为 Realm 的默认配置Realm()

最好的做法是不要保留任何引用,Realm()除非你有充分的理由。每次调用 时Realm(),它都会返回一个先前缓存的对象实例,因此通过创建对实例的引用并在应用程序的生命周期中挂在该实例上并没有性能优势。

使用迁移信息设置对象的最佳位置Configuration是在代码有机会调用Realm(). 所以应用程序委托是一个很好的地方。

如果您有依赖于Realm()已经预配置的类属性,则将lazy关键字添加到这些属性可能会有所帮助,这样它们的创建就会延迟到您真正需要它们为止。

于 2016-10-03T17:51:36.053 回答