2015-04-15 15 views
12

Ich verwende Realm für Android, um einige Daten zu speichern. Wenn der Benutzer die Schaltfläche zum Abmelden drückt, möchte ich meine gesamte Realm-Datenbank löschen. Um das zu tun, habe ich den folgenden Code-Snippet:Wie überprüfen Sie, ob eine Realm-Instanz bereits geschlossen wurde?

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

Das Problem jetzt in meiner onResume Funktion ist. Ich erhalte die folgende Ausnahme:

Verursacht von: java.lang.IllegalStateException: Diese Realm-Instanz wurde bereits geschlossen, wodurch sie unbrauchbar wird.

Mein onResume Code ist wie folgt:

@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 
} 

Wie kann ich überprüfen, um zu sehen, ob ein Bereich Objekt bereits geschlossen worden ist? Oder gibt es eine bessere Möglichkeit, die Datenbank zu löschen als die Realm-Datei zu löschen?

-

Edit: Gerade gesehen, How can I easily delete all objects in a Realm für iOS. Gibt es ein Wort darüber, wann die deleteAllObjects-API für Android verfügbar sein wird? Zum Zeitpunkt des Schreibens hat Android Version 0.80.0 und die API ist in iOS in 0.87.0 verfügbar.

+0

können Sie bitte Grim's Antwort akzeptieren? Sieht so aus, als hätte er dir genau das gegeben, was du verlangst. –

Antwort

3

Um zu überprüfen, ob das Reich Instanz geschlossen ist, verwenden Realm Methode isClosed:

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

alle Realm zu löschen, ohne deleting the realm file Objekte können Sie Realm-Methode clear verwenden; Leider müssen Sie die RealmObject-Klasse übergeben:

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

RealmObjects hat eine isValid() Methode, die false zurückgibt, wenn das Objekt in der Datenbank gelöscht wurde oder der Realm geschlossen ist, z.

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 
} 

alle

Die Android-API Löschen hat eine Realm.clear(Class clazz) Methode, die das Gleiche tut. http://realm.io/docs/java/api/io/realm/Realm.html#clear-java.lang.Class- Dies ist, um den Rest der Sammlung APIs nachzuahmen, aber ich kann die Verwirrung in Bezug auf die iOS-API sehen.

+0

Danke für die Antwort. Ich hätte den Begriff "Reichsobjekt" nicht verwenden sollen, da es sich um einen überladenen Begriff handelt. Ich habe mich tatsächlich auf Objekte der Klasse Realm bezogen. Es scheint mir seltsam zu sein, eine Abfrage zu machen, um zu sehen, ob das Reich geschlossen ist. In Bezug auf Realm.clear, sieht es so aus, dass nur alle Objekte einer bestimmten Klasse gelöscht werden. Im Vergleich dazu entfernt deleteAllObjects alle Objekte in der Realm-Datenbank. Gibt es eine bessere Möglichkeit, das gleiche Verhalten zu erreichen, als Realm.clear für alle meine möglichen Klassen aufzurufen? – zongweil

+0

Derzeit nicht, aber wenn Sie die Datenbank löschen möchten, können Sie stattdessen nur die Realm-Datei löschen. Alternativ müssten Sie für jede Modellklasse clear() aufrufen. –

+0

Ich verstehe nicht, Sie haben eine Methode namens 'checkIfValid()' in 'BaseRealm', die die Bedingung' if (sharedGroupManager! = Null &&! SharedGroupManager.isOpen()) {'angibt, ob das Realm geschlossen ist oder nicht ; Warum ist das nicht öffentlich zugänglich (geschützt)? Zeit für mich, die Reflection Route zu gehen, da 'Realm'' final' ist ... – EpicPandaForce

1

Stattdessen tun:

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

Auf diese Weise müssen Sie nicht überprüfen, ob das Reich Objekt geschlossen wird, aber nur überprüfen, ob es null ist.

Verwandte Themen