通过添加 List() 和另一个模型执行迁移 class
Perform migration by adding List() and another model class
我有以下型号
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<Area>()
添加到区域class,将dynamic var region: Region?
添加到区域class,请问如何执行迁移块?因为迁移文档中的示例仅演示原始类型。
这是一个可能的解决方案,假设旧架构版本为 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))")
注意:您将需要实施return您针对给定区域划分的方法,反之亦然。
收到澄清后编辑
好的。因此,由于您确实希望在将其添加到模型时预先填充 areas
,因此您毕竟需要在迁移块中实现一些逻辑。
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
}
}
}
some sample code 展示了如何在 Realm Swift 的示例代码集合中处理迁移中的 List 对象
如果您将 region
属性 添加到 Area
的目的是为了找出此 Area
是哪个 Region
对象的子对象,那么您就不需要将其实现为模型 属性。相反,您可以使用 linkingObjects(_: forProperty: )
让 Realm 代表您解决这个问题。
class Area: Object {
dynamic var id = 0
dynamic var name = ""
var regions: [Region] {
return linkingObjects(Region.self, forProperty: "areas")
}
override static func primaryKey() -> String? {
return "id"
}
}
为了证实我在评论中所说的话,迁移是一种单向路径。它们不能降级到以前的架构版本。如果你想在 Realm 文件上快速调试迁移过程,我建议将原始 Realm 文件放在一边并处理副本。
原答案
您真的有任何数据要添加到这些新属性中吗?由于它看起来不像您那样,因此您不需要在迁移块中实现任何代码。
只需增加 Realm 架构版本号,并提供一个空的迁移块。
let config = Realm.Configuration(
schemaVersion: 1,
migrationBlock: { migration, oldSchemaVersion in
})
Realm.Configuration.defaultConfiguration = config
虽然迁移块不能为零,但如果旧 Realm 文件中有您想要在迁移期间操作的任何数据(即将其移动到另一个 属性,您只需要将代码放在那里).如果您要添加全新的属性,则无需在迁移块中对它们执行任何操作。
进入 Realm 迁移的思维模式需要一些时间,但值得庆幸的是,一旦你进入,你就会意识到它们比你想象的要容易。 :)
(免责声明:我在 Realm 工作,但我在我自己的一个 iOS 应用程序中使用它,此时我已经在真实用户数据上进行了多次迁移.:))
我有以下型号
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<Area>()
添加到区域class,将dynamic var region: Region?
添加到区域class,请问如何执行迁移块?因为迁移文档中的示例仅演示原始类型。
这是一个可能的解决方案,假设旧架构版本为 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))")
注意:您将需要实施return您针对给定区域划分的方法,反之亦然。
收到澄清后编辑
好的。因此,由于您确实希望在将其添加到模型时预先填充 areas
,因此您毕竟需要在迁移块中实现一些逻辑。
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
}
}
}
some sample code 展示了如何在 Realm Swift 的示例代码集合中处理迁移中的 List 对象
如果您将 region
属性 添加到 Area
的目的是为了找出此 Area
是哪个 Region
对象的子对象,那么您就不需要将其实现为模型 属性。相反,您可以使用 linkingObjects(_: forProperty: )
让 Realm 代表您解决这个问题。
class Area: Object {
dynamic var id = 0
dynamic var name = ""
var regions: [Region] {
return linkingObjects(Region.self, forProperty: "areas")
}
override static func primaryKey() -> String? {
return "id"
}
}
为了证实我在评论中所说的话,迁移是一种单向路径。它们不能降级到以前的架构版本。如果你想在 Realm 文件上快速调试迁移过程,我建议将原始 Realm 文件放在一边并处理副本。
原答案
您真的有任何数据要添加到这些新属性中吗?由于它看起来不像您那样,因此您不需要在迁移块中实现任何代码。
只需增加 Realm 架构版本号,并提供一个空的迁移块。
let config = Realm.Configuration(
schemaVersion: 1,
migrationBlock: { migration, oldSchemaVersion in
})
Realm.Configuration.defaultConfiguration = config
虽然迁移块不能为零,但如果旧 Realm 文件中有您想要在迁移期间操作的任何数据(即将其移动到另一个 属性,您只需要将代码放在那里).如果您要添加全新的属性,则无需在迁移块中对它们执行任何操作。
进入 Realm 迁移的思维模式需要一些时间,但值得庆幸的是,一旦你进入,你就会意识到它们比你想象的要容易。 :)
(免责声明:我在 Realm 工作,但我在我自己的一个 iOS 应用程序中使用它,此时我已经在真实用户数据上进行了多次迁移.:))