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



我正在努力找出打开/关闭Realm实例的最佳方式。我们在三个地方使用Realm——应用程序、活动和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));
}

第2版:我们实际上已经解决了这个问题:

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

使用copyFromRealm将为您提供所有数据的内存副本,因此只要您不加载庞大的列表,它应该可以正常工作。不过,你会使用更多的内存,而且一直打开和关闭境界都会有一些开销。

控制Realm生命周期的一个想法可以在这里看到:https://realm.io/docs/java/latest/#controlling-领域实例的生命周期

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

最新更新