web-dev-qa-db-fra.com

La migration de royaume ne fonctionne pas

    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
            if (oldSchemaVersion < 1) {
                // Nothing to do!
                // Realm will automatically detect new properties and removed properties
                // And will update the schema on disk automatically
            }
    })

    // Tell Realm to use this new configuration object for the default Realm
    Realm.Configuration.defaultConfiguration = config

    // Now that we've told Realm how to handle the schema change, opening the file
    // will automatically perform the migration
    let realm = try! Realm()

Cela a été mis en application (application: didFinishLaunchingWithOptions :)

Dans mon programme de test, j'ai changé les champs de mon objet. Je voudrais supprimer tout dans la base de données et passer aux nouveaux types de champs. J'ai copié le code ci-dessus à partir de la documentation, mais cela ne semble rien faire. Je reçois toujours ces erreurs:

fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=0 "Migration is required due to the following errors: 
- Property types for 'unit' property do not match. Old type 'string', new type 'int'
- Property 'reps' has been added to latest object model." UserInfo={NSLocalizedDescription=Migration is required due to the following errors: 
- Property types for 'unit' property do not match. Old type 'string', new type 'int'
- Property 'reps' has been added to latest object model.}: file   /Library/Caches/com.Apple.xbs/Sources/swiftlang/swiftlang-700.1.101.15/src/Swift/stdlib/public/core/

Des idées?

13
user2179936

Tant que vous êtes uniquement en développement local, je vous recommande de réinitialiser votre base de données Realm au lieu d'effectuer une migration. Les migrations sont la solution, si vous avez déjà fourni une version de votre application avec un autre schéma et souhaitez conserver les données utilisateur.

Vous pouvez supprimer la base de données en supprimant l'application du simulateur ou du périphérique. Vous pouvez également utiliser NSFileManager pour supprimer le fichier Realm avant d'accéder à la base de données.

let defaultPath = Realm.Configuration.defaultConfiguration.path!
try NSFileManager.defaultManager().removeItemAtPath(defaultPath)
3
marius

Un problème similaire se produisait: mon application allait tomber en panne malgré le fait que j'avais ajouté le code de migration par défaut dans didFinishLaunchingWithOptions

Le problème était que j'étais en train d'initialiser une instance de Realm dans mon premier contrôleur de vue en tant que propriété de niveau classe. Donc, la suppression de cet objet royaume de niveau classe de mon premier ViewController a résolu le problème. 

import UIKit
import RealmSwift

class ViewController: UIViewController{
  let db = try! Realm() // Removing this solved my issue

  func doSomething(){
    let db = try! Realm() // Placed this here instead
  }
}

J'ai plutôt créé l'objet dans la fonction qui en avait besoin, ce qui est de toute façon une meilleure approche.

12
Geoherna

Assurez-vous de ne pas essayer d'instancier l'instance de Realm () avant que la configuration de la migration ne soit définie dans application(application:didFinishLaunchingWithOptions:). Lorsqu'il se bloque, vérifiez la pile d'exécution pour trouver quelle instance a déclenché une exception. La même erreur s'est produite. Dans mon cas, l'instance Realm de l'un de mes contrôleurs de vue a été instanciée avant la définition du bloc de migration.

Bonne chance

3
Digitech

Êtes-vous sûr d'avoir correctement mis à jour votre schemaVersion? Si vous définissez schemaVersion: 1 avant d'apporter des modifications, vous devez le remplacer par 2 pour que la migration se déclenche.

1
arsenius

J'ai souvent la même erreur fatale aussi. Cela se produit généralement lorsque vous apportez des modifications aux objets du royaume avec une "clé primaire". La solution la plus rapide et la plus simple consiste à supprimer simplement l'application du périphérique ou du simulateur, puis de relancer votre projet. .

1
Mo Iisa

Je trouve la meilleure solution:

Vous devez ajouter Code de migration de domaine avant didFinishLaunchingWithOptions dans willFinishLaunchingWithOptions

func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {

    RealmManager.shared.configureRealm()

    return true
}
0
Zhanserik