Swift 通过添加List()和另一个模型类来执行迁移
我有以下型号Swift 通过添加List()和另一个模型类来执行迁移,swift,realm,realm-migration,Swift,Realm,Realm Migration,我有以下型号 class Area: Object { // Specify properties to ignore (Realm won't persist these) // override static func ignoredProperties() -> [String] { // return [] // } dynamic var id = 0 dynamic var name = "" override static func
class Area: Object {
// Specify properties to ignore (Realm won't persist these)
// override static func ignoredProperties() -> [String] {
// return []
// }
dynamic var id = 0
dynamic var name = ""
override static func primaryKey() -> String? {
return "id"
}
}
class Region: Object {
// Specify properties to ignore (Realm won't persist these)
// override static func ignoredProperties() -> [String] {
// return []
// }
dynamic var id = 0
dynamic var name = ""
override static func primaryKey() -> String? {
return "id"
}
}
我想将
let areas=List()
添加到Region类和dynamic var Region:Region?
添加到Area类,请问如何执行迁移块?因为迁移文档中的示例仅演示了原语类型。这里有一个可能的解决方案,设想旧模式版本为0,新模式版本为1:
let migrationBlock: MigrationBlock = { migration, oldSchemaVersion in
if oldSchemaVersion < 1 {
//Migrate Regions
migration.enumerate(Region.className()) { oldObject, newObject in
if oldSchemaVersion < 1 {
//Get appropriate area object for this Region Object
let area = areaForRegion(newObject) //<-- implement this
newObject.areas.append(area)
}
}
//Migrate areas
migration.enumerate(Area.className()) { oldObject, newObject in
if oldSchemaVersion < 1 {
//Get appropriate region object for this area Object and set up the relation
let region = regionForArea(newObject) //<-- implement this
newObject.region = region
}
}
}
print("Migration complete.")
}
Realm.Configuration.defaultConfiguration = Realm.Configuration(schemaVersion: 1, migrationBlock: migrationBlock)
// print out all migrated objects in the default realm
// migration is performed implicitly on Realm access
print("Migrated Area objects in the default Realm: \(try! Realm().objects(Area))")
print("Migrated Region objects in the default Realm: \(try! Realm().objects(Region))")
let migrationBlock:migrationBlock={migration,oldSchemaVersion in
如果oldschemaversation<1{
//迁移区域
migration.enumerate(Region.className()){oldObject,newObject在
如果oldschemaversation<1{
//获取此区域对象的适当区域对象
让area=areaForRegion(newObject)/在收到澄清后编辑
好的。既然你确实想在你把区域添加到你的模型中时预先填充它,那么你需要在你的迁移块中实现一些逻辑
let migrationBlock: MigrationBlock = { migration, oldSchemaVersion in
migration.enumerate(Region.className()) { oldObject, newObject in
if oldSchemaVersion < 1 {
let areas = newObject?["areas"] as? List<MigrationObject>
// Add new objects to 'areas' as needed
}
}
}
为了证实我在评论中所说的,迁移是单向的。它们不能降级到以前的架构版本。如果您想在域文件上快速调试迁移过程,我建议将原始域文件放在一边,并处理副本
原始答案
您是否确实有任何想要添加到这些新属性中的数据?因为看起来不像,所以不需要在迁移块中实现任何代码
只需增加领域模式版本号,并提供一个空迁移块
let config = Realm.Configuration(
schemaVersion: 1,
migrationBlock: { migration, oldSchemaVersion in
})
Realm.Configuration.defaultConfiguration = config
虽然迁移块不能为零,但如果在迁移过程中旧领域文件中有任何数据需要处理(即,将其移动到另一个属性),则只需将代码放入其中。如果要添加全新的属性,则无需在迁移块内对其执行任何操作
let config = Realm.Configuration(
schemaVersion: 1,
migrationBlock: { migration, oldSchemaVersion in
})
Realm.Configuration.defaultConfiguration = config
进入领域迁移的思维模式需要一段时间,但谢天谢地,一旦你这样做,你就会意识到它们比你想象的要容易
(免责声明:我为Realm工作,但我在自己的一个出货iOS应用程序中使用了它,在这里,我已经对真实用户数据进行了多次迁移。:)很抱歉,正如您所知,我在迁移方面非常新。但我在哪里可以实现区域对区域和区域对区域?我可以不只是像……比如说在string的情况下,“”(空值)首先?当然,您可以将区域作为可选区域,在迁移到该区域时只需设置nil值。如果您还没有任何区域要添加,则可以删除区域类的迁移代码。如果oldSchemaVersion<2{newObject![“region”]=region?}返回编译错误:(我如何调试我的迁移btw?例如,如果我的架构已经是版本1,我如何更改回版本0以测试我的schemaversion 1 schemaI的实际功能。这就是为什么我问“如何调试我的迁移btw?如果我的架构已经是版本1,我如何更改回版本0以测试我的schemaversion 1 schemaI”您不需要在迁移中使用写块吗?@@因为我实际上有一个同时具有region和area的Outlet类,我现在要做的是将这两个类链接在一起哦!好的。我会更新我的答案。遗憾的是,迁移只是单向的。您无法将域文件还原回版本0。如果您想快速测试迁移域文件,请使用原始领域文件的副本。那么如何访问领域以获得我的出口,例如更新区域/区域模型?