Как вы проверяете, закрыт ли экземпляр области?

Я использую 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 ли он.