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。如果您想快速测试迁移域文件,请使用原始领域文件的副本。那么如何访问领域以获得我的出口,例如更新区域/区域模型?