2015-04-15 12 views
12

Sto usando Realm per Android per memorizzare alcuni dati. Quando l'utente preme il pulsante di disconnessione, desidero cancellare l'intero database di Realm. Per fare ciò, ho il seguente snippet di codice:Come si controlla se un'istanza di dominio è stata già chiusa?

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

Il problema è ora nella mia funzione onResume. Ricevo la seguente eccezione:

Causato da: java.lang.IllegalStateException: questa istanza di Realm è già stata chiusa, rendendola inutilizzabile.

Il mio codice onResume è il seguente:

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

Come posso controllare per vedere se un oggetto ambito è stato già chiuso? In alternativa, esiste un modo migliore per cancellare il database rispetto all'eliminazione del file realm?

-

Edit: appena ha visto How can I easily delete all objects in a Realm per iOS. Qualche parola su quando l'API deleteAllObjects sarà disponibile per Android? Al momento della scrittura, Android è alla versione 0.80.0 e l'API è disponibile in iOS in 0.87.0.

+0

puoi accettare la risposta di Grim? Sembra che ti abbia dato esattamente quello che stavi chiedendo. –

risposta

3

Per verificare se l'istanza regno è chiusa, l'utilizzo Realm metodo isClosed:

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

Per eliminare tutti gli oggetti Reame senza deleting the realm file, è possibile utilizzare il metodo di Realm clear; sfortunatamente devi passare la classe di RealmObject:

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

RealmObjects ha un metodo isValid() che restituirà false se l'oggetto è stato cancellato nel database o il Realm è chiuso, ad es.

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 
} 

Elimina tutto

L'API Android ha un metodo Realm.clear(Class clazz) che fa la stessa cosa. http://realm.io/docs/java/api/io/realm/Realm.html#clear-java.lang.Class- Ciò serve a simulare il resto delle API della raccolta, ma posso vedere la confusione riguardo all'API iOS.

+0

Grazie per la risposta. Non avrei dovuto usare il termine "realm object" perché sembra che sia un termine sovraccarico. In realtà mi riferivo a oggetti del Reame di classe. Mi sembra strano dover fare una query per vedere se il regno è chiuso. Riguardo a Realm.clear, sembra che solo cancelli tutti gli oggetti di una particolare classe. In confronto, deleteAllObjects rimuove tutti gli oggetti nel database di Realm. C'è un modo migliore per ottenere lo stesso comportamento che chiamare Realm.clear su tutte le mie possibili classi? – zongweil

+0

Attualmente no, ma se si desidera cancellare il database, è sufficiente eliminare il file Realm. In alternativa dovresti chiamare clear() per ogni classe del modello. –

+0

Non capisco, hai un metodo chiamato 'checkIfValid()' in 'BaseRealm' che specifica la condizione' if (sharedGroupManager! = Null &&! SharedGroupManager.isOpen()) {'per se il Realm è chiuso o no ; perché non è pubblicamente accessibile (protetto)? Tempo per me di seguire la rotta di riflessione come 'Realm' è' finale' ... – EpicPandaForce

1

Invece, fare questo:

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

In questo modo, non c'è bisogno di convalidare se l'oggetto regno è chiuso, ma controlla solo se si tratta di nulla.

Problemi correlati