我可能误解了问题,但您似乎已经将现有数据存储为字符串,并希望将所有这些数据“转换”为整数。
您不能直接更改类型为另一种类型并同时更改存储的数据。如果这样做,它将被标记为错误。
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
}
}
})
let items = realm.object(Item.self)
即使没有写入任何数据,也会存储该模型。如果在该行之后,将变量类型从字符串更改为整数,则会引发迁移错误。
如果是这种情况,删除Realm并从头开始是一种选择,如上所述,还可以使用迁移块。
如果这是一个全新的模型,从未被使用过,则根据注释和其他答案建议,只需将字符串更改为整数即可。
在您的对象模型中,只需将String更改为Int即可。请注意,Realm文档中指出:
使用标准Swift语法,可以将String、NSDate和NSData属性声明为可选或非可选。
因此,与先前模型中的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>()
}
Int
。您还应该编辑问题,以包括Realm模型定义,而不是数据库截图,以使问题符合主题。 - Dávid Pásztorlet items = realm.object(Item.self)
),即使从未编写过数据,该模型也将存在于Realm文件中,如果将String更改为Int,则会引发迁移错误。 - Jay