我正在尝试从以下模型执行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类型:可选Int
应转换为可选String
。我已经像这样实现了它:
if (oldSchemaVersion < 1) {
migration.enumerate(RealmBuddy.className()) { oldObject, newObject in
if let contactId = oldObject!["contactId"] as? Int {
newObject!["contactId"] = "\(contactId)"
}
}
}
但是,我发现在迁移后,没有contactId(即nil
值)的实体现在的contactId等于&#34; 0&#34;串。似乎oldObject![&#34; contactId&#34;]返回0而不是nil。
我还没有找到关于如何执行这个简单任务的任何信息或示例,所以我不确定我是否正确检索/转换值(也试图转换为RealmOptional<Int>
),所以我决定在github上提交问题之前先询问一下这个问题。 这是一个错误还是预期的行为?如果是预期的行为,如何正确获得价值?
PS:我的项目是开源的,因为我是iOS的新手,并开发它用于自我教育,因此我将其推到repo,可以轻松复制该问题(请注意,它位于 migration_issue 分支中)。我还使用现有的.realm
文件创建了unit test,该文件在测试期间迁移到新模式。希望这会有所帮助。
PPS:我尝试了0.102.1和0.103.1版本的库。
PPPS:有人提到Realm Browser在我的示例.realm文件中没有显示任何带有nil值的contactId。我认为这只是Realm Browser问题,因此我在另一个分支中创建了另一个unit test来证明旧数据库具有 nil值。
答案 0 :(得分:0)
当我在领域浏览器中打开default-v0.realm时,我看不到任何带有空contactId
的行。如果您希望有一个问题,则问题出在最初填充Realm的代码中,而不是迁移代码。
答案 1 :(得分:0)
这是一个错误。见https://github.com/realm/realm-cocoa/pull/3643。固定于0.103.2。
标量类型的可选属性是错误的Objective-C 类型代码,导致动态访问器采用非可选的 代码路径。这导致nil值返回为0。