我使用Realm for Android来存储一些数据。当用户按下注销按钮时,我想清除整个Realm数据库。为此,我有以下代码片段:
realm.close();
realm.deleteRealmFile(this);
goToLoginActivity();
现在的问题出在我的onResume函数中。我得到以下例外:
引起:java.lang.IllegalStateException:此Realm实例已被关闭,使其无法使用。
我的onResume代码如下:
@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
}
如何查看领域对象是否已经关闭?或者,有没有比删除领域文件更好的清除数据库的方法?
-
编辑:刚刚看到iOS的How can I easily delete all objects in a Realm。关于何时deleteAllObjects API可用于Android的任何消息?在撰写本文时,Android版本为0.80.0,API在iOS中为0.87.0。
答案 0 :(得分:7)
RealmObjects有一个isValid()
方法,如果在数据库中删除了对象或者Realm已关闭,它将返回false,例如。
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
}
全部删除
android API有一个Realm.clear(Class clazz)
方法可以做同样的事情。 http://realm.io/docs/java/api/io/realm/Realm.html#clear-java.lang.Class-这是为了模仿Collection API的其余部分,但我可以看到有关iOS API的混淆。
答案 1 :(得分:2)
要检查领域实例是否已关闭,请使用Realm的方法isClosed:
if(realm.isClosed()) {
// Do something
}
要删除所有没有deleting the realm file的Realm对象,可以使用Realm的方法clear;不幸的是,你必须传递RealmObject的类:
Realm realm = Realm.getInstance(context);
realm.beginTransaction();
realm.clear(SomeClass.class);
realm.clear(AnotherClass.class);
realm.commitTransaction();
realm.close();
答案 2 :(得分:1)
相反,这样做:
if (realm != null) {
realm.close();
realm = null;
}
这样,您不必验证领域对象是否已关闭,而只检查它是否为空。