2

我正在尝试从以下模型执行 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 值。

4

2 回答 2

0

当我在领域浏览器中打开 default-v0.realm 时,我看不到任何带有 null 的行contactId。如果您希望有一个,那么问题出在最初填充 Realm 的代码中,而不是迁移代码中。

于 2016-05-23T18:08:02.320 回答
0

这是一个错误。请参阅https://github.com/realm/realm-cocoa/pull/3643。在 0.103.2 中修复。

标量类型的可选属性得到错误的 Objective-C 类型代码,导致动态访问器采用非可选代码路径。这导致 nil 值返回为 0。

于 2016-05-24T10:19:01.467 回答