web-dev-qa-db-fra.com

"migration de domaine nécessaire", exception dans Android lors de la récupération des valeurs de la base de données du domaine

J'utilise Realm comme back-end dans ma candidature. J'ai créé une table nommée Setting. J'ai ajouté des valeurs dans ce tableau, en suivant les étapes données sur le site officiel de Realm. Mais quand je vais récupérer des valeurs de cette table, je reçois 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 j'ai du mal à comprendre quel est le problème.

39
Sanket Ranaware

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

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

REMARQUE: Avec cette option de configuration, toute modification de schéma entraînera 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é

Il est donc 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", String.class, FieldAttribute.REQUIRED);
            oldVersion++;
            ... 

  // hash code, equals 

Et

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

si vous téléchargez l'application à stocker, la fonction "supprimer et réinstaller l'application" ne fonctionnera pas pour les autres utilisateurs, vous devez donc travailler avec "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 dernier domaine (3.0.0), le domaine a modifié la structure du constructeur, vous devez donc faire quelque chose comme ceci:

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

Vous avez changé quelque chose pour la structure du royaume.

Pour le corriger, vous devez inclure migration ou simplement supprimer l'application et la réinstaller.

13
Lars Celie

Ç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);

    }
5
Cedriga