我正在尝试从以下模型执行 Realm.IO 迁移:
public class RealmBuddy: Object {
dynamic var id = 0
let contactId = RealmOptional<Int>()
dynamic var name = ""
let topics = List<RealmTopic>()
override static func primaryKey() -> String? {
return "id"
}
}
到以下:
public class RealmBuddy: Object {
dynamic var id = 0
dynamic var contactId: String? = nil
dynamic var name = ""
let topics = List<RealmTopic>()
override public static func primaryKey() -> String? {
return "id"
}
}
如您所见,唯一的变化在于 contactId 的类型: optionalInt
应转换为 optional String
。我已经这样实现了:
if (oldSchemaVersion < 1) {
migration.enumerate(RealmBuddy.className()) { oldObject, newObject in
if let contactId = oldObject!["contactId"] as? Int {
newObject!["contactId"] = "\(contactId)"
}
}
}
但是,我发现在迁移后,我没有contactId(即nil
值)的实体现在的contactId 等于“0”字符串。看来 oldObject!["contactId"] 返回 0 而不是 nil。
我没有找到关于如何执行这个简单任务的任何信息或示例,所以我不确定我是否正确检索/转换了值(RealmOptional<Int>
也尝试转换为),所以我决定在提交问题之前在这里询问它github。这是一个错误还是预期的行为?如果是预期行为,如何正确获取价值?
PS:我的项目是开源的,因为我是 iOS 新手,并且为了自学而开发它,所以我将它推送到一个可以轻松重现问题的仓库(请注意它在migration_issue分支中)。我还使用现有文件进行了单元测试.realm
,该文件在测试期间迁移到新模式。希望这会有所帮助。
PPS:我尝试了 0.102.1 和 0.103.1 版本的库。
PPPS:有人提到 Realm Browser 在我的示例 .realm 文件中不显示任何带有 nil 值的 contactId。我认为这只是 Realm Browser 问题,所以我在单独的分支中进行了另一个单元测试,以证明旧数据库具有nil 值。