Swift 是否有方法更改领域数据库中的数据类型?
如图所示,我完全搞乱了数据类型(红色圆圈)。有没有办法将数据类型更改为整数 编辑 我想将数据类型从字符串更改为Int,并且我有现有的数据,所以我不能从一个新的领域开始,而只是更改var类型Swift 是否有方法更改领域数据库中的数据类型?,swift,realm,realm-database,Swift,Realm,Realm Database,如图所示,我完全搞乱了数据类型(红色圆圈)。有没有办法将数据类型更改为整数 编辑 我想将数据类型从字符串更改为Int,并且我有现有的数据,所以我不能从一个新的领域开始,而只是更改var类型 class Item: Object { @objc dynamic var name: String? @objc dynamic var itemid: String? @objc dynamic var cateid: String? } 只需在对象模型中将字符串更改为Int即
class Item: Object {
@objc dynamic var name: String?
@objc dynamic var itemid: String?
@objc dynamic var cateid: String?
}
只需在对象模型中将字符串更改为Int即可。请注意,领域文档说明: 可以使用标准Swift语法将字符串、NSDate和NSData属性声明为可选或非可选 因此,与先前模型中的字符串不同,您将无法将Int声明为可选。您有两个选择:
class Item: Object {
@objc dynamic var name: String?
@objc dynamic var itemid: Int = 0
@objc dynamic var cateid: Int = 0
}
类项:对象{
@objc动态变量名称:字符串?
@objc dynamic var itemid=RealmOptional()
@objc动态变量cateid=realmopational()
}
有关每个解决方案的更多信息,请参见和我可能误解了这个问题,但您似乎将现有数据存储为字符串,并且希望将所有这些数据“转换”为Int 不能直接将类型更改为其他类型,也不能同时更改存储的数据。如果您这样做,它将被标记为错误
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
}
}
})
将存储该模型,即使从未写入任何数据。如果在该行之后,var类型从字符串更改为Int,则会抛出迁移错误
如果是这种情况,删除领域并从头开始是一种选择,如上所述,迁移块也是一种选择
如果这是从未使用过的全新模型,那么正如注释和其他答案所示,只需将字符串更改为Int。只需将变量类型更改为
Int
。您还应该将您的问题包括领域模型定义,而不是db的屏幕截图,以便就主题提出问题。@DávidPásztor我可能遗漏了一些内容或不理解该问题,但更改现有模型的基本类型和数据不会引发迁移错误吗?请参阅我的答案以了解我的意思。@Jay OP没有询问迁移现有数据库的问题,只是更改了数据类型:)当然,如果要转换现有数据库,需要实现迁移block@D阿维德帕斯托尔感谢您的澄清。我正在查看屏幕截图中显示的现有数据-不确定这是否是一个因素。为了澄清,如果对象模型以任何方式被访问,(例如:let items=realm.object(Item.self)
),即使从未写入任何数据,该模型也将存在于realm文件中,如果字符串更改为Int,它将抛出迁移错误。嗨,Jay,你能帮我编辑我的问题吗?我的问题似乎不是很清楚。。。但你的答案正是我想做的。@kit当然!我在问题中添加了一些小的修改,以便于澄清——首先,这对我来说是相当清楚的。很高兴答案有用。
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
}
}
})
let items = realm.object(Item.self)