有没有办法更改Realm数据库中的数据类型?

时间:2019-12-13 09:46:34

标签: swift realm realm-database

如您所见,我完全弄乱了数据类型(红色圆圈)。有没有办法将数据类型更改为整数?

编辑

我想将数据类型从字符串更改为整数,并且我已有数据,所以我不能从新领域开始,而只能更改var类型。

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

enter image description here

2 个答案:

答案 0 :(得分:1)

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

您不能直接将类型更改为其他类型,也不能更改存储的数据。如果这样做,它将被标记为错误。

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

您需要合并migration block才能将字符串值“转换”为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)

即使没有数据写入,也将存储该模型。如果在该行之后将var类型从String更改为Int,则会引发迁移错误。

如果是这种情况,则删除领域并从头开始是一种选择,如上所述,这是一个迁移块。

如果这是从未使用过的全新模型,则根据注释和其他答案的建议,只需将String更改为Int。

答案 1 :(得分: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>()
    }
    

有关每种解决方案的详细信息,请参见this SO answerRealm documentation.