有没有办法更改领域数据库中的数据类型?
Is there a way to change the Data Type in Realm Database?
正如你所看到的图像,我完全搞砸了数据类型(红色圆圈)。有没有办法将数据类型更改为整数?
编辑
我想将数据类型从 String 更改为 Int,并且我有现有数据,所以我不能从一个新领域开始,只能更改 var 类型。
class Item: Object {
@objc dynamic var name: String?
@objc dynamic var itemid: String?
@objc dynamic var cateid: String?
}
只需将对象模型中的 String 更改为 Int。请注意 Realm 文档说:
String, NSDate, and NSData properties can be declared as optional or non-optional using the standard Swift syntax.
因此,与之前模型中的 String 不同,您将无法将 Int 声明为可选。您有两个选择:
声明默认值:
class Item: Object {
@objc dynamic var name: String?
@objc dynamic var itemid: Int = 0
@objc dynamic var cateid: Int = 0
}
将其声明为 RealmOptional:
class Item: Object {
@objc dynamic var name: String?
@objc dynamic var itemid = RealmOptional<Int>()
@objc dynamic var cateid = RealmOptional<Int>()
}
有关每个解决方案的更多信息,请参阅 and the Realm documentation.
我可能误解了这个问题,但您似乎将现有数据存储为字符串,并且您想 'convert' 将所有这些数据都存储为 Int。
您不能直接将类型更改为另一种类型并更改存储的数据。如果这样做,它将被标记为错误。
Error!
Migration is required due to the following errors:
- Property 'Item.itemid' has been changed from 'string' to 'int'.
你需要把一个migration block到'convert'的字符串值合并成一个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。
正如你所看到的图像,我完全搞砸了数据类型(红色圆圈)。有没有办法将数据类型更改为整数?
编辑
我想将数据类型从 String 更改为 Int,并且我有现有数据,所以我不能从一个新领域开始,只能更改 var 类型。
class Item: Object {
@objc dynamic var name: String?
@objc dynamic var itemid: String?
@objc dynamic var cateid: String?
}
只需将对象模型中的 String 更改为 Int。请注意 Realm 文档说:
String, NSDate, and NSData properties can be declared as optional or non-optional using the standard Swift syntax.
因此,与之前模型中的 String 不同,您将无法将 Int 声明为可选。您有两个选择:
声明默认值:
class Item: Object { @objc dynamic var name: String? @objc dynamic var itemid: Int = 0 @objc dynamic var cateid: Int = 0 }
将其声明为 RealmOptional:
class Item: Object { @objc dynamic var name: String? @objc dynamic var itemid = RealmOptional<Int>() @objc dynamic var cateid = RealmOptional<Int>() }
有关每个解决方案的更多信息,请参阅
我可能误解了这个问题,但您似乎将现有数据存储为字符串,并且您想 'convert' 将所有这些数据都存储为 Int。
您不能直接将类型更改为另一种类型并更改存储的数据。如果这样做,它将被标记为错误。
Error!
Migration is required due to the following errors:
- Property 'Item.itemid' has been changed from 'string' to 'int'.
你需要把一个migration block到'convert'的字符串值合并成一个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。