gpt4 book ai didi

java - 跨所有线程使用 Realm

转载 作者:行者123 更新时间:2023-11-29 02:41:41 33 4
gpt4 key购买 nike

我有用于 CRUD 操作的 DBManager 类,我想在应用程序中使用它,我知道 Realm 对象只能在创建它们的线程上访问,因此我无法在线程内使用我的 DBManager 类方法等等……

我想要的是从服务内部运行的线程调用 DBManager 内部声明的 updateUploadingFileStatus 方法。

这是我的 DBManager 类

object DbManager {
private val realm: Realm by lazy { Realm.getDefaultInstance() }

fun saveOrRemoveUploadFile(filePath: String, save: Boolean){
val model = getUploadModelByFilePath(filePath)
realm.executeTransaction {
model.markedForUpload = save
realm.insertOrUpdate(model)
}
}

fun updateUploadingFileStatus(filePath: String, uploaded: Boolean){
val model = getUploadModelByFilePath(filePath)
realm.executeTransaction {
model.uploadedStatus = uploaded
}
}

fun getFilesForUpload() : List<UploadModel> {
return realm
.where(UploadModel::class.java)
.equalTo("markedForUpload",true)
.equalTo("uploadedStatus",false)
.findAll()
}

fun getUploadModelByFilePath(filePath: String) : UploadModel {
return realm.where(UploadModel::class.java).equalTo("filePath",filePath).findFirst() ?: UploadModel(filePath)
}

}

从另一个线程调用这个方法会抛出 java.lang.IllegalStateException Realm access from incorrect thread. 如何解决这个问题?做这样的事情的好的风格是什么?

最佳答案

按如下方式更改您的函数代码:

 public void updateUploadingFileStatus(final String filePath, final Boolean uploaded) {
mRealm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
UploadModel model = getUploadModelByFilePath(filePath);
model.uploadedStatus = uploaded;
}
});
}

前段时间我通过使用一个新的交易解决了这个问题。我还使用 Singleton 类来访问 RealmDB,并在来自网络的响应处理程序中调用此函数。这应该有效。

关于java - 跨所有线程使用 Realm ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43629026/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com