我想知道是否有建议在多个线程中使用RealmDB的做法。
我的场景:我使用一个线程循环遍历RealmDB中的记录并执行某些操作。基于上一个操作的响应,我想从另一个线程中删除记录。
实现这一目标的最佳方法是什么?
答案 0 :(得分:2)
您可以跨线程传递RealmObject字段值(例如id,primaryKey),这意味着当您在另一个线程上完成“action1”时,您可以将id传递给负责的线程为了处理Realm操作,查询需要删除的Object并从Realm中删除它们,你可以执行TransactionSnsactionAsync来进一步从Realm运行的线程中删除删除操作。
修改
让我们看看一些代码:
让我们在你的一个类中说你有一个Realm实例,并且你正在对ThreadA进行读操作(在这个例子中是mainThread)
realm.where(GitHubUser.class).findAll().asObservable()
.filter(RealmResults::isLoaded)
.filter(RealmResults::isValid)
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(gitHubUsers -> {
for (GitHubUser gitHubUser : gitHubUsers) {
Log.e("TAG", "data = " + gitHubUser.getLogin());
}
});
以及相应的addChangeListener版本
RealmResults realmResults = realm.where(GitHubUser.class).findAll();
realmResults.addChangeListener(new RealmChangeListener<RealmResults>() {
@Override
public void onChange(RealmResults element) {
for (GitHubUser gitHubUser : gitHubUsers) {
Log.e("TAG", "data = " + gitHubUser.getLogin());
}
}
});
for (GitHubUser gitHubUser : gitHubUsers) {
Log.e("TAG", "data = " + gitHubUser.getLogin());
}
让我们说你得到了触发器并希望删除一个单独线程上的一个条目,你应该做的是,获取一个新的Realm实例,删除如下所示的条目并关闭Realm实例。 这样您就不会遇到任何线程问题,并且在您删除条目后,您的Read查询会收到通知,您可以使用更新的数据更新视图。
new Thread(() -> {
Realm realm1 = Realm.getDefaultInstance();
GitHubUser gitHubUser = realm1.where(GitHubUser.class)
.equalTo("login", "loginString")
.findFirst();
if (gitHubUser != null) {
realm1.executeTransaction(realm2 -> gitHubUser.deleteFromRealm());
}
realm1.close();
}).run();