【问题标题】:Is there a way to change the Data Type in Realm Database?有没有办法改变领域数据库中的数据类型?
【发布时间】:2019-12-13 09:46:34
【问题描述】:

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

编辑

我想将数据类型从 String 更改为 Int,并且我有现有数据,所以我不能从新领域开始,而只是更改 var 类型。

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

【问题讨论】:

  • 只需将变量类型更改为Int。您还应该edit您的问题包括领域模型定义而不是您的数据库的屏幕截图,以使问题成为主题。
  • @DávidPásztor 我可能遗漏了一些东西或不理解这个问题,但不会更改带有数据的现有模型的原始类型会引发迁移错误?请参阅我的答案以了解我的意思。
  • @Jay OP 没有询问迁移现有数据库,只是更改数据类型 :) 当然,如果要转换现有数据库,则需要实现迁移块
  • @DávidPásztor 感谢您的澄清。我正在查看屏幕截图中显示的现有数据 - 不确定这是否是一个因素。为澄清起见,如果对象模型以任何方式被访问(如:let items = realm.object(Item.self)),即使没有写入数据,该模型也将存在于 Realm 文件中,并且如果将 String 更改为 Int,它会抛出迁移错误。

标签: swift realm realm-database


【解决方案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,则会引发迁移错误。

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

如果这是从未使用过的全新模型,那么正如 cmets 和其他答案所建议的那样,只需将 String 更改为 Int。

【讨论】:

  • 嗨杰,你能帮我编辑我的问题吗?我的问题似乎不太清楚......但你的答案是我想做的事情。
  • @kit 当然可以!我对问题进行了小幅编辑以进行澄清-我一开始就很清楚。很高兴答案有所帮助。
【解决方案2】:

只需在您的 Object 模型中将 String 更改为 Int。请注意,Realm 文档说:

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

因此,与之前模型中的 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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 2016-08-10
    相关资源
    最近更新 更多