web-dev-qa-db-fra.com

Comment vérifier si une instance de domaine a déjà été fermée?

J'utilise Realm for Android pour stocker des données. Lorsque l'utilisateur appuie sur le bouton de déconnexion, je souhaite effacer toute la base de données de mon royaume. Pour ce faire, j'ai l'extrait de code suivant:

realm.close();
realm.deleteRealmFile(this);
goToLoginActivity();

Le problème est maintenant dans ma fonction onResume. Je reçois l'exception suivante:

Causée par: Java.lang.IllegalStateException: cette instance de royaume a déjà été fermée, ce qui la rend inutilisable.

Mon code onResume est le suivant:

@Override
protected void onResume() {
    super.onResume();

    // I'm trying to check if the realm is closed; this does not work
    if (realm == null) {
        realm = Realm.getInstance(this);
    }

    // Do query using realm
}

Comment puis-je vérifier si un objet de domaine a déjà été fermé? Sinon, existe-t-il un meilleur moyen d'effacer la base de données que de supprimer le fichier de domaine?

-

Edit: Just saw Comment puis-je supprimer facilement tous les objets d’un royaume pour iOS. Un mot sur le moment où l'API deleteAllObjects sera disponible pour Android? Au moment de la rédaction, Android est à la version 0.80.0 et l'API est disponible dans iOS à la version 0.87.0.

14
zongweil

Pour vérifier si l'instance de royaume est fermée, utilisez la méthode de Realm isClosed :

if(realm.isClosed()) {
    // Do something
}

Pour supprimer tous les objets du royaume sans supprimer le fichier du royaume , vous pouvez utiliser la méthode du royaume clear ; Malheureusement, vous devez passer la classe de RealmObject:

Realm realm = Realm.getInstance(context);
realm.beginTransaction();
realm.clear(SomeClass.class);
realm.clear(AnotherClass.class);
realm.commitTransaction();
realm.close();
2
grim

RealmObjects a une méthode isValid() qui renvoie false si l'objet a été supprimé de la base de données ou si le domaine est fermé, par exemple.

Realm realm = Realm.getInstance(getContext());
Foo foo = realm.allObjects(Foo.class).findFirst();
if (foo.isValid()) {
  // Do something with Foo
} else {
  // Any operation will throw a IllegalStateException
}

Supprimer tout

L'API Android a une méthode Realm.clear(Class clazz) qui fait la même chose. http://realm.io/docs/Java/api/io/realm/Realm.html#clear-Java.lang.Class- Ceci est pour imiter le reste de l'API Collection, mais je peux voir la confusion en ce qui concerne l'API iOS.

7
Christian Melchior

Au lieu de cela, faites ceci: 

if (realm != null) {
  realm.close();
  realm = null;
}

De cette façon, vous n'avez pas à valider si l'objet royaume est fermé, mais seulement à vérifier s'il est nul.

1
TruMan1