Realm Swift更改命名变量

时间:2018-06-17 19:01:12

标签: ios swift realm database-migration

我有Realm迁移的经验,所以我对它有所了解。

无论如何要解释我的情况我有一个名为phoneInfo的变量,其类型为PhoneInfo,但Android开发人员对我进行了更改,现在我需要它为{{1}类型}。

所以为了更直接地说,我有这个:

String

但是,现在我需要这个:

public class TestResult:Object{
    @objc dynamic var id:String = UUID().uuidString
    @objc dynamic var phoneInfo:PhoneInfo = PhoneInfo() //before change
    override class public func primaryKey() -> String? { return "id" }
}

我无法在Realm文档中找到它,尽管我会继续寻找。我发现这个Github link描述了我的问题。但是,我无法将objective-c翻译成Swift4。

这是我的PhoneInfo对象:

public class TestResult:Object{
    @objc dynamic var id:String = UUID().uuidString
    @objc dynamic var phoneInfo:String = "\(PhoneInfo().BaseOS)" //after change
    override class public func primaryKey() -> String? { return "id" }
}

我正在尝试在AppDelegate.swift中迁移数据。

public class PhoneInfo:Object, Codable {
    @objc dynamic var BaseOS:String = UIDevice.current.systemName
    @objc dynamic var OsVersion:String = UIDevice.current.systemVersion
    @objc dynamic var Manufacturer:String = UIDevice.current.identifierForVendor!.uuidString
    @objc dynamic var Model:String = UIDevice.current.model
}

欢迎任何帮助。我当然会尝试自己解决,如果我这样做的话会发布。

2 个答案:

答案 0 :(得分:1)

问题是PhoneInfo代表了该类型的当前实现,因此oldObject无法转换为PhoneInfo,因为它代表旧的PhoneInfo类型,它不会#39;在类型系统中不再存在。

您可以将oldObject转换为MigrationObject,但实际上您并不需要编写任何迁移代码,因为phoneInfo具有默认值,因此Realm可以在迁移期间简单地将默认值phoneInfo分配给变量。你只需要碰撞架构版本,你就可以了。

Realm.Configuration.defaultConfiguration = Realm.Configuration(
    schemaVersion: 6,
    migrationBlock: { migration, oldSchemaVersion in
        if oldSchemaVersion < 6 {
            // Realm can handle the migration automatically, no need to do anything
        }
})
let r = try! Realm()

答案 1 :(得分:0)

所以我不确定这是否是正确的方法,但取出行

let phoneInfo = oldObject!["phoneInfo"] as! PhoneInfo

为我做了诀窍。我的AppDelegate现在看起来像:

Realm.Configuration.defaultConfiguration = Realm.Configuration(
        schemaVersion: 6,
        migrationBlock: { migration, oldSchemaVersion in
            if (oldSchemaVersion < 6) {
                migration.enumerateObjects(ofType: TestResult.className()) { oldObject, newObject in
                    //changed
                    newObject!["phoneInfo"] = "iOS"
                }
            }
    })
    let r = try! Realm()