Swift 中的领域迁移
Realm migrations in Swift
我有一个这样建模的领域对象
class WorkoutSet: Object {
// Schema 0
dynamic var exerciseName: String = ""
dynamic var reps: Int = 0
// Schema 0 + 1
dynamic var setCount: Int = 0
}
我正在尝试执行迁移。
在我的 AppDelegate
中,我导入了 RealmSwift
。
在函数 didFinishLaunchWithOptions
中调用
Migrations().checkSchema()
Migrations 是在另一个文件中声明的 class。
在该文件中有一个结构声明为如此。
func checkSchema() {
Realm.Configuration(
// Set the new schema version. This must be greater than the previously used
// version (if you've never set a schema version before, the version is 0).
schemaVersion: 1,
// Set the block which will be called automatically when opening a Realm with
// a schema version lower than the one set above
migrationBlock: { migration, oldSchemaVersion in
// We haven’t migrated anything yet, so oldSchemaVersion == 0
switch oldSchemaVersion {
case 1:
break
default:
// Nothing to do!
// Realm will automatically detect new properties and removed properties
// And will update the schema on disk automatically
self.zeroToOne(migration)
}
})
}
func zeroToOne(migration: Migration) {
migration.enumerate(WorkoutSet.className()) {
oldObject, newObject in
let setCount = 1
newObject!["setCount"] = setCount
}
}
我在将 setCount
添加到模型时遇到错误
您将需要调用迁移。仅仅创建一个配置,不会调用它。有两种方法:
将迁移配置设置为 Realm 的默认配置-
let config = Realm.Configuration(
// Set the new schema version. This must be greater than the previously used
// version (if you've never set a schema version before, the version is 0).
schemaVersion: 1,
// Set the block which will be called automatically when opening a Realm with
// a schema version lower than the one set above
migrationBlock: { migration, oldSchemaVersion in
if oldSchemaVersion < 1 {
migration.enumerate(WorkoutSet.className()) { oldObject, newObject in
newObject?["setCount"] = setCount
}
}
}
)
Realm.Configuration.defaultConfiguration = config
或
- 使用 migrateRealm 手动迁移:
migrateRealm(config)
现在您的迁移应该可以正常进行了。
因为您刚刚创建 Realm.Configuration
。如果需要,迁移块由 Realm 调用。您不能直接调用迁移。
所以要调用迁移块,您应该将配置对象设置为Realm,或者设置为默认配置。然后创建 Realm 实例。
因此您需要执行以下操作:
let config = Realm.Configuration(
// Set the new schema version. This must be greater than the previously used
// version (if you've never set a schema version before, the version is 0).
schemaVersion: 1,
// Set the block which will be called automatically when opening a Realm with
// a schema version lower than the one set above
migrationBlock: { migration, oldSchemaVersion in
// We haven’t migrated anything yet, so oldSchemaVersion == 0
switch oldSchemaVersion {
case 1:
break
default:
// Nothing to do!
// Realm will automatically detect new properties and removed properties
// And will update the schema on disk automatically
self.zeroToOne(migration)
}
})
let realm = try! Realm(configuration: config) // Invoke migration block if needed
我有一个这样建模的领域对象
class WorkoutSet: Object {
// Schema 0
dynamic var exerciseName: String = ""
dynamic var reps: Int = 0
// Schema 0 + 1
dynamic var setCount: Int = 0
}
我正在尝试执行迁移。
在我的 AppDelegate
中,我导入了 RealmSwift
。
在函数 didFinishLaunchWithOptions
中调用
Migrations().checkSchema()
Migrations 是在另一个文件中声明的 class。
在该文件中有一个结构声明为如此。
func checkSchema() {
Realm.Configuration(
// Set the new schema version. This must be greater than the previously used
// version (if you've never set a schema version before, the version is 0).
schemaVersion: 1,
// Set the block which will be called automatically when opening a Realm with
// a schema version lower than the one set above
migrationBlock: { migration, oldSchemaVersion in
// We haven’t migrated anything yet, so oldSchemaVersion == 0
switch oldSchemaVersion {
case 1:
break
default:
// Nothing to do!
// Realm will automatically detect new properties and removed properties
// And will update the schema on disk automatically
self.zeroToOne(migration)
}
})
}
func zeroToOne(migration: Migration) {
migration.enumerate(WorkoutSet.className()) {
oldObject, newObject in
let setCount = 1
newObject!["setCount"] = setCount
}
}
我在将 setCount
添加到模型时遇到错误
您将需要调用迁移。仅仅创建一个配置,不会调用它。有两种方法:
将迁移配置设置为 Realm 的默认配置-
let config = Realm.Configuration( // Set the new schema version. This must be greater than the previously used // version (if you've never set a schema version before, the version is 0). schemaVersion: 1, // Set the block which will be called automatically when opening a Realm with // a schema version lower than the one set above migrationBlock: { migration, oldSchemaVersion in if oldSchemaVersion < 1 { migration.enumerate(WorkoutSet.className()) { oldObject, newObject in newObject?["setCount"] = setCount } } } ) Realm.Configuration.defaultConfiguration = config
或
- 使用 migrateRealm 手动迁移:
migrateRealm(config)
现在您的迁移应该可以正常进行了。
因为您刚刚创建 Realm.Configuration
。如果需要,迁移块由 Realm 调用。您不能直接调用迁移。
所以要调用迁移块,您应该将配置对象设置为Realm,或者设置为默认配置。然后创建 Realm 实例。
因此您需要执行以下操作:
let config = Realm.Configuration(
// Set the new schema version. This must be greater than the previously used
// version (if you've never set a schema version before, the version is 0).
schemaVersion: 1,
// Set the block which will be called automatically when opening a Realm with
// a schema version lower than the one set above
migrationBlock: { migration, oldSchemaVersion in
// We haven’t migrated anything yet, so oldSchemaVersion == 0
switch oldSchemaVersion {
case 1:
break
default:
// Nothing to do!
// Realm will automatically detect new properties and removed properties
// And will update the schema on disk automatically
self.zeroToOne(migration)
}
})
let realm = try! Realm(configuration: config) // Invoke migration block if needed