我想弄清楚打开/关闭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
。
答案 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