web-dev-qa-db-fra.com

Migrations de domaine dans Swift

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

13
Cody Weaver

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:

  1. 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

  1. Migrez manuellement à l'aide de migrateRealm:

migrateRealm (config)

Votre migration devrait maintenant fonctionner correctement.

28
Shripada

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
4
kishikawa katsumi