我有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
}
欢迎任何帮助。我当然会尝试自己解决,如果我这样做的话会发布。
答案 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()