我试图找出打开/关闭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
在每个查询之后调用我们。
使用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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句