可以在每次查询/写入后关闭Realm实例吗?

时间:2016-05-15 09:26:37

标签: android realm rx-java

我想弄清楚打开/关闭Realm实例的最佳方法是什么。我们在3个地方使用Realm - App,Activities和Worker线程。但是,从任何地方访问Realm中的数据可能会非常酷。因此,我们将所有Realm查询/写入包装在数据层中。是否可以(从性能的角度来看)为每个查询执行以下操作(每次写入时都类似)?

try (Realm realm = getRealm()) {
    return realm.copyFromRealm(realm.where(Task.class).isNull("name")
    .findAllSorted("createdAt", Sort.DESCENDING));
}

你如何在异步交易中做类似的事情?有更好的方法吗? (我们正在使用RxJava)。

谢谢!

编辑:在@ christian-melchior的快速回复之后,我们会像这样使用它:

try (Realm realm = getRealm()) {
    return realm.copyFromRealm(realm.where(Task.class).isNull("name")
    .findAllSortedAsync("createdAt", Sort.DESCENDING));
}

EDIT2:我们实际上确定了这一点:

Realm realm = getRealm();
return realm.where(Task.class).isNull("name")
  .findAllSortedAsync("createdAt", Sort.DESCENDING)
  .asObservable()
  .filter(RealmResults::isLoaded)
  .first()
  .map(realmObjects -> {
      if (realmObjects.isEmpty()) {
          realm.close();
          return null;
      }
      List<Task> res = realm.copyFromRealm(realmObjects);
      realm.close();
      return res;
  });

因为我们希望在每次查询后调用onComplete

1 个答案:

答案 0 :(得分:1)

使用copyFromRealm将为您提供所有数据的内存副本,因此只要您不加载大型列表,它就可以正常工作。您将使用更多内存,并且始终打开和关闭Realms会有轻微的开销。

可以在此处看到控制Realm生命周期的一个想法:https://realm.io/docs/java/latest/#controlling-the-lifecycle-of-realm-instances

另请注意,如果您担心在UI线程上加载数据,在许多情况下您可以使用我们的异步API:https://realm.io/docs/java/latest/#asynchronous-queries