Question RLMException, la migration est requise pour le type d'objet


J'ai un objet NotSureItem dans lequel j'ai trois propriétés 'title' dont le nom est renommé en 'text' et textDescription que j'avais ajouté plus tard et une propriété dateTime. Maintenant, quand je vais lancer mon application, elle se bloque lorsque je veux ajouter quelque chose à ces propriétés. Il montre les déclarations suivantes.

"La migration est requise pour le type d'objet 'NotSureItem' en raison des erreurs suivantes: - La propriété 'text' est absente du dernier modèle d'objet. - La propriété 'title' a été ajoutée au dernier modèle d'objet. - La propriété 'textDescription' a été ajoutée au dernier modèle d'objet. '

Voici son code:

import Foundation
import Realm

class NotSureItem: RLMObject {
    dynamic var title = ""   // renamed from 'text'
    dynamic var textDescription = "" // added afterwards
    dynamic var dateTime = NSDate()
}

19
2017-10-27 08:57


origine


Réponses:


Supprimez simplement votre application et exécutez-la à nouveau.

Chaque fois que vous modifiez les propriétés de vos objets Realm, votre base de données existante devient incompatible avec la nouvelle.

Tant que vous êtes encore en phase de développement, vous pouvez simplement supprimer l'application du simulateur / périphérique et la redémarrer.

Plus tard, lorsque votre application a été publiée et que vous modifiez les propriétés de vos objets, vous devez implémenter une migration vers la nouvelle version de la base de données.


79
2017-10-27 09:00



Supprimer l'application et réinstaller n'est pas une bonne pratique. Nous devons intégrer certaines étapes de la migration lors du développement dès la première fois que nous rencontrons un besoin de migration. Le lien donné par SilentDirge est bon: document de migration de domaine, qui donne de bons exemples pour gérer différentes situations.

Pour une tâche de migration minimale, l'extrait de code suivant du lien ci-dessus peut effectuer automatiquement la migration et doit être utilisé avec les applications AppDelegate. disFinishLaunchWithOptions méthode:

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 _ = try! Realm()


15
2018-03-09 03:54



Le code ci-dessous fonctionne pour moi

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{  
RLMRealmConfiguration *config = [RLMRealmConfiguration    defaultConfiguration];
 config.schemaVersion = 2;
config.migrationBlock = ^(RLMMigration *migration, uint64_t  oldSchemaVersion) {
  // The enumerateObjects:block: method iterates
  // over every 'Person' object stored in the Realm file
  [migration enumerateObjects:Person.className
                    block:^(RLMObject *oldObject, RLMObject *newObject) {
    // Add the 'fullName' property only to Realms with a schema version of 0
    if (oldSchemaVersion < 1) {
      newObject[@"fullName"] = [NSString stringWithFormat:@"%@ %@",
                            oldObject[@"firstName"],
                            oldObject[@"lastName"]];
    }

    // Add the 'email' property to Realms with a schema version of 0 or 1
    if (oldSchemaVersion < 2) {
     newObject[@"email"] = @"";
    }
  }];
 };
[RLMRealmConfiguration setDefaultConfiguration:config];

// now that we have updated the schema version and provided a migration block,
// opening an outdated Realm will automatically perform the migration and
// opening the Realm will succeed
[RLMRealm defaultRealm];

return YES;
}

Plus d'informations : https://realm.io/docs/objc/latest/#getting-started


6
2018-06-08 07:32



Votre base de données modifiée n'est plus compatible avec la base de données enregistrée, raison pour laquelle une migration est requise. Vos options sont de supprimer l'ancien fichier de base de données et de le lancer (fonctionne parfaitement si vous êtes dans la phase de développement initiale) ou, si vous êtes en ligne, effectuez la migration.

Vous faites cela en définissant une version de schéma et en fournissant un "script" de migration de base de données dans votre configuration de domaine. L'ensemble du processus est documenté ici (avec des exemples de code): ici


3
2017-07-06 08:09



Vous pouvez effacer la base de données au lancement comme ceci:

[[NSFileManager defaultManager] removeItemAtURL:[RLMRealmConfiguration defaultConfiguration].fileURL error:nil];

2
2017-12-02 22:04



Il suffit d'incrémenter la version du schéma

Realm détectera automatiquement les nouvelles propriétés et les propriétés supprimées

var 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: 2,

            // 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
                }
        })


        do{
            realm = try Realm(configuration: config)

            print("Database Path : \(config.fileURL!)")
        }catch{
            print(error.localizedDescription)
        }

0
2018-04-05 10:06