【问题标题】:How do you check if a realm instance has been closed already?你如何检查一个领域实例是否已经关闭?
【发布时间】:2015-04-15 21:23:58
【问题描述】:

我正在使用 Realm for Android 来存储一些数据。当用户按下注销按钮时,我想清除我的整个 Realm 数据库。为此,我有以下 sn-p 代码:

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
}

如何检查领域对象是否已经关闭?或者,有没有比删除领域文件更好的方法来清除数据库?

--

编辑:刚刚看到How can I easily delete all objects in a Realm for iOS。关于 deleteAllObjects API 何时可用于 Android 的任何消息?在撰写本文时,Android 版本为 0.80.0,iOS 中的 API 版本为 0.87.0。

【问题讨论】:

  • 你能接受冷酷的回答吗?看起来他完全按照你的要求给了你。

标签: java android realm


【解决方案1】:

RealmObjects 有一个isValid() 方法,如果对象已从数据库中删除或领域已关闭,则该方法将返回 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 的混淆。

【讨论】:

  • 感谢您的回复。我不应该使用术语“领域对象”,因为它看起来像是一个重载术语。我实际上指的是 Realm 类的对象。对我来说,必须进行查询才能查看领域是否已关闭,这似乎很奇怪。关于 Realm.clear,看起来这只清除了特定类的所有对象。相比之下,deleteAllObjects 删除了 Realm 数据库中的所有对象。有没有比在我所有可能的类上调用 Realm.clear 更好的方法来获得相同的行为?
  • 目前没有,但如果你想清除数据库,你可以直接删除 Realm 文件。或者,您必须为每个模型类调用 clear()。
  • 我不明白,你在BaseRealm中有一个叫checkIfValid()的方法,它指定了Realm是否关闭的条件if (sharedGroupManager != null && !sharedGroupManager.isOpen()) {;为什么这不能公开访问(受保护)?我该去反思路线了,Realmfinal...
  • .isClosed()isValid()有什么区别?我已经检查了isClosed() 条件,但这也给出了错误。
【解决方案2】:

要检查领域实例是否关闭,请使用领域的方法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();

【讨论】:

    【解决方案3】:

    相反,这样做:

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

    这样,您不必验证领域对象是否已关闭,而只需检查它是否为空。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      相关资源
      最近更新 更多