Android 从多个线程访问RealmDB

Android 从多个线程访问RealmDB,android,multithreading,realm,Android,Multithreading,Realm,我想知道是否有跨多个线程使用RealmDB的推荐实践 我的场景:我使用一个线程在RealmDB中循环记录并执行一些操作。根据前面操作的响应,我想从另一个线程中删除记录 实现这一点的最佳方法是什么?您可以跨线程传递RealmObject字段值(例如id、primaryKey),这意味着当您在另一个线程上完成“action1”时,您可以将id传输到负责处理领域操作的线程,查询对象需要从领域中移除并删除它们,您可以执行eTransactionAsync以进一步从领域正在运行的线程中删除操作 编辑 域

我想知道是否有跨多个线程使用RealmDB的推荐实践

我的场景:我使用一个线程在RealmDB中循环记录并执行一些操作。根据前面操作的响应,我想从另一个线程中删除记录


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

您可以跨线程传递RealmObject字段值(例如id、primaryKey),这意味着当您在另一个线程上完成“action1”时,您可以将id传输到负责处理领域操作的线程,查询对象需要从领域中移除并删除它们,您可以执行eTransactionAsync以进一步从领域正在运行的线程中删除操作

编辑

  • 域内写入操作不会阻止读取操作
  • RealmResults&RealmObjects在我们关闭领域实例之前都是活动对象
  • 如果您使用读取操作作为Observable,所有进一步的修改都会被通知,如果您不想使用Observable,您也可以使用addChange listener
让我们看看一些代码:

假设在您的一个类中有一个领域实例,并且您正在ThreadA上执行读取操作(本例中为mainThread)

和相应的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());
}

Viraj I无法使用executeTransactionAsync,因为我需要仅在单独的线程接收到外部事件时在其上执行删除操作。你提到的另一个解决方案我知道我的问题是:你有10条DB记录。您正在线程A中循环它们。您从线程A发布Record1,同时在线程B上收到Record1的响应。现在,在这种情况下,您仍然在线程A中循环记录2到10,但您需要从线程B中删除记录1。我们如何安全地执行此操作?@ATO请找到更新的答案,如果不是您想要的,请告诉我。谢谢,这似乎是一个很好的解决方案。让我试试这个。
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());
}
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();