从多个线程访问RealmDB

时间:2016-07-05 15:38:17

标签: android multithreading realm

我想知道是否有建议在多个线程中使用RealmDB的做法。

我的场景:我使用一个线程循环遍历RealmDB中的记录并执行某些操作。基于上一个操作的响应,我想从另一个线程中删除记录。

实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

您可以跨线程传递RealmObject字段值(例如id,primaryKey),这意味着当您在另一个线程上完成“action1”时,您可以将id传递给负责的线程为了处理Realm操作,查询需要删除的Object并从Realm中删除它们,你可以执行TransactionSnsactionAsync来进一步从Realm运行的线程中删除删除操作。

修改

  • 在Realm中,写操作不会阻止读操作。
  • RealmResults&在我们关闭Realm实例
  • 之前,RealmObjects是LIVE对象
  • 如果您使用Read操作作为Observable,将通知所有进一步的修改,如果您不想使用Observable,您也可以使用addChange listener。

让我们看看一些代码:

让我们在你的一个类中说你有一个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();