Как вы проверяете, закрыт ли экземпляр области?
Я использую Realm для 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
}
Как проверить, закрыт ли объект области? Альтернативно, есть ли лучший способ очистить базу данных, чем удалить файл области?
-
Изменить: просто увидел Как я могу легко удалить все объекты в Realm для iOS. Любое слово о том, когда API-интерфейс deleteAllObjects будет доступен для Android? На момент написания Android Android был версии 0.80.0, а API доступен в iOS в 0.87.0.
Ответы
Ответ 1
Чтобы проверить, закрыт ли экземпляр области, используйте метод Realm isClosed:
if(realm.isClosed()) {
// Do something
}
Чтобы удалить все объекты Realm без удаление файла области, вы можете использовать метод Realm clear; к сожалению, вы должны пройти класс RealmObject:
Realm realm = Realm.getInstance(context);
realm.beginTransaction();
realm.clear(SomeClass.class);
realm.clear(AnotherClass.class);
realm.commitTransaction();
realm.close();
Ответ 2
RealmObjects имеет метод isValid()
, который вернет false, если объект был удален в базе данных, или Realm закрыт, например.
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
}
Удалить все
API android имеет метод Realm.clear(Class clazz)
, который делает то же самое. http://realm.io/docs/java/api/io/realm/Realm.html#clear-java.lang.Class- Это должно имитировать остальную часть API Collection, но я вижу замешательство в отношении API iOS.
Ответ 3
Вместо этого сделайте следующее:
if (realm != null) {
realm.close();
realm = null;
}
Таким образом, вам не нужно проверять, закрыт ли объект realm, но только проверьте, не null ли он.