«Migration de domaine nécessaire», exception dans Android lors de la récupération des valeurs du domaine db

J’utilise Realm comme back end dans mon application. J’ai créé une table nommée Setting. J’ai ajouté des valeurs dans ce tableau en suivant les étapes indiquées sur le site officiel de Realm. Mais quand je vais récupérer des valeurs de cette table, j’obtiens une exception

“io.realm.exceptions.RealmMigrationNeededException: RealmMigration doit être fourni” sur la ligne: “realm = Realm.getInstance (getApplicationContext ());”.

En fait, je suis nouveau sur Android et Realm, donc trouver des problèmes pour comprendre ce qui est un problème.

EDIT: pour les nouvelles versions de Realm, Realm.init (Contexte contextuel) est ajouté

Realm.init(context); RealmConfiguration config = new RealmConfiguration .Builder() .deleteRealmIfMigrationNeeded() .build(); 

REMARQUE: Avec cette option de configuration, tout changement de schéma entraînera une perte de données , en particulier:

  • un champ est ajouté / supprimé
  • une nouvelle classe RealmObject est ajoutée
  • un RealmObject existant est supprimé
  • @Required est ajouté / supprimé
  • @PrimaryKey est ajouté / supprimé
  • @Index est ajouté / supprimé

Donc, il est principalement recommandé lorsque l’application est en phase de développement.


Ou ajoutez une migration en suivant les documents officiels:

https://realm.io/docs/java/latest/#migrations

Par exemple,

 public class Migration implements RealmMigration { @Override public void migrate(final DynamicRealm realm, long oldVersion, long newVersion) { RealmSchema schema = realm.getSchema(); if (oldVersion == 0) { RealmObjectSchema personSchema = schema.get("Person"); personSchema .addField("fullName", Ssortingng.class, FieldAtsortingbute.REQUIRED); oldVersion++; ... // hash code, equals 

Et

 Realm.init(context); RealmConfiguration config = new RealmConfiguration.Builder() .migration(new Migration()) // .deleteRealmIfMigrationNeeded() .build(); 

Si vous téléchargez l’application pour la stocker, “supprimer et réinstaller l’application” ne fonctionnera pas pour les autres utilisateurs. Vous devez donc “supprimer” le domaine et “réinstaller” le domaine, pas l’application. voici la façon de le faire, j’espère que ça vous aidera !!

  RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this).build(); try { return Realm.getInstance(realmConfiguration); } catch (RealmMigrationNeededException e){ try { Realm.deleteRealm(realmConfiguration); //Realm file has been deleted. return Realm.getInstance(realmConfiguration); } catch (Exception ex){ throw ex; //No Realm file to remove. } } 

MODIFIER

Pour le nouveau royaume (3.0.0), Realm a modifié la structure du constructeur, vous devez donc faire quelque chose comme ceci:

 Realm.init(context); RealmConfiguration config = new RealmConfiguration .Builder() .deleteRealmIfMigrationNeeded() .build(); 

Vous avez changé quelque chose à la structure du domaine.

Pour résoudre ce problème, vous devez inclure la migration ou simplement supprimer l’application et l’installer à nouveau.

Ça marche pour moi

  Realm.init(context); Realm realm; try{ realm = Realm.getDefaultInstance(); }catch (Exception e){ // Get a Realm instance for this thread RealmConfiguration config = new RealmConfiguration.Builder() .deleteRealmIfMigrationNeeded() .build(); realm = Realm.getInstance(config); } 

Version Kotlin:

 val realm = try { Realm.init(this) val config = RealmConfiguration.Builder() .deleteRealmIfMigrationNeeded() .build() Realm.getInstance(config) } catch (ex: RealmMigrationNeededException) { Realm.getDefaultInstance() }