在Realm数据库中是否有一种方法可以更改数据类型?

3

如图所示,我完全搞乱了数据类型(红圈)。有没有办法将数据类型更改为整数?

编辑

我想将数据类型从字符串更改为整数,并且我已经有现有的数据,因此我不能从头开始创建一个新的实例并只更改变量类型。

class Item: Object {
    @objc dynamic var name: String?
    @objc dynamic var itemid: String?
    @objc dynamic var cateid: String?
}

enter image description here


1
只需将变量类型更改为Int。您还应该编辑问题,以包括Realm模型定义,而不是数据库截图,以使问题符合主题。 - Dávid Pásztor
@DávidPásztor,我可能错过了什么或者没有理解问题,但是更改具有数据的现有模型的原始类型会引发迁移错误吗?请参见我的答案。 - Jay
@Jay OP 没有问如何迁移现有数据库,只是更改数据类型 :) 当然,如果您想转换现有数据库,您需要实现迁移块。 - Dávid Pásztor
@DávidPásztor 感谢你的澄清。我正在查看屏幕截图中显示的现有数据 - 不确定它是否是一个因素。澄清一下,如果以任何方式访问了对象模型(例如:let items = realm.object(Item.self)),即使从未编写过数据,该模型也将存在于Realm文件中,如果将String更改为Int,则会引发迁移错误。 - Jay
2个回答

2

我可能误解了问题,但您似乎已经将现有数据存储为字符串,并希望将所有这些数据“转换”为整数。

您不能直接更改类型为另一种类型并同时更改存储的数据。如果这样做,它将被标记为错误。

Error!
  Migration is required due to the following errors:
- Property 'Item.itemid' has been changed from 'string' to 'int'.

您需要在代码中加入一个迁移块,将字符串值转换为Int。假设我们向对象`item_id`添加了一个新的Int属性,以下代码可以将您的字符串迁移到int,并在字符串无效时将其赋值为0。

Realm.Configuration.defaultConfiguration = Realm.Configuration(
schemaVersion: 1,
migrationBlock: { migration, oldSchemaVersion in
    if (oldSchemaVersion < 1) {
        migration.enumerateObjects(ofType: Item.className()) { oldObject, newObject in
            let stringValue = oldObject!["itemid"] as! String
            newObject!["item_id"] = Int(stringValue) ?? 0
        }
    }
})

此外,一旦访问Realm,对象模型就会被写入到Realm文件中。因此,只需要简单的操作即可。
let items = realm.object(Item.self)

即使没有写入任何数据,也会存储该模型。如果在该行之后,将变量类型从字符串更改为整数,则会引发迁移错误。

如果是这种情况,删除Realm并从头开始是一种选择,如上所述,还可以使用迁移块。

如果这是一个全新的模型,从未被使用过,则根据注释和其他答案建议,只需将字符串更改为整数即可。


嗨,Jay,你能帮我编辑一下我的问题吗?似乎我的问题不是很清楚...但是你的答案正是我想要做的事情。 - kit
@kit 当然!我对问题进行了小修改以澄清 - 对我来说一开始就很清楚。很高兴答案有所帮助。 - Jay

0

在您的对象模型中,只需将String更改为Int即可。请注意,Realm文档中指出:

使用标准Swift语法,可以将String、NSDate和NSData属性声明为可选或非可选。

因此,与先前模型中的String不同,您将无法将Int声明为可选。您有两个选择:

  1. 声明默认值:

    class Item: Object {
       @objc dynamic var name: String?
       @objc dynamic var itemid: Int = 0
       @objc dynamic var cateid: Int = 0
    }
    
  2. 将其声明为 RealmOptional

    class Item: Object {
       @objc dynamic var name: String?
       @objc dynamic var itemid = RealmOptional<Int>()
       @objc dynamic var cateid = RealmOptional<Int>()
    }
    

如需更多关于每个解决方案的信息,请参见此SO答案Realm文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接