迁移期间,可选的Int属性包含nil而不是零

时间:2016-05-23 14:10:23

标签: ios swift realm realm-migration

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这是一个错误。见https://github.com/realm/realm-cocoa/pull/3643。固定于0.103.2。

  

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