我正在努力找出打开/关闭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-查询