J'ai un objet de royaume modélisé comme tel
class WorkoutSet: Object {
// Schema 0
dynamic var exerciseName: String = ""
dynamic var reps: Int = 0
// Schema 0 + 1
dynamic var setCount: Int = 0
}
J'essaie d'effectuer une migration.
Dans mon AppDelegate
j'ai importé RealmSwift
.
Dans la fonction didFinishLaunchWithOptions
j'appelle
Migrations().checkSchema()
Migrations est une classe déclarée dans un autre fichier.
Dans ce fichier, il y a une structure déclarée comme telle.
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
}
}
Je reçois une erreur pour l'ajout de setCount
au modèle
Vous devrez invoquer la migration. La simple création d'une configuration ne l'invoquera pas. Il y a deux façons de le faire:
Définissez votre configuration avec la migration comme configuration par défaut de 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
OU
migrateRealm (config)
Votre migration devrait maintenant fonctionner correctement.
Parce que vous créez simplement Realm.Configuration
. Le bloc de migration est appelé par Realm si nécessaire. Vous ne pouvez pas appeler directement la migration.
Donc, pour invoquer un bloc de migration, vous devez définir l'objet de configuration sur Realm ou définir la configuration par défaut. Créez ensuite une instance de domaine.
Vous devez donc procéder comme suit:
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