【发布时间】:2019-04-20 00:45:33
【问题描述】:
我正在研究 Rxjava2,我正在尝试将 Room Library 与 Rxjava2 集成。问题是:我有一个填充表,每次登录应用程序时,我都需要删除该表,然后在数据库中插入新内容。另外,删除和插入工作正常,但是当我在删除表内容后尝试插入新值时,delete 方法会删除所有新值..(部分代码在 kotlin 中,其他在 java 中)
我已经尝试过了:RxJava2 + Room: data is not being inserted in DB after clearAllTables() call,但没有成功..
道
@Dao
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(list:List<Something>)
@Query("DELETE FROM SomethingTable")
fun delete()
@Query("SELECT * FROM SomethingTable")
fun getAll(): Flowable<List<Something>>
我的类调用DAO(CallDao)
//insert
fun insertInDB(list: List<Something>) {
Completable.fromAction {
dbDAO!!.insert(list)
}.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe()
}
//delete
fun clean() {
Completable.fromAction {
dbDAO!!.delete()
}.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.single())
.subscribe()
}
//search all
fun findAll(): Observable<List<Something>>? {
return Observable.create { subscriber ->
dbDAO!!.getAll()
.subscribeOn(Schedulers.io())
.subscribe {it->
subscriber.onNext(it)
}
}
}
点击登录按钮时调用的方法
private void clearAndInsertInDB() {
CallDao callDao= new CallDao(getActivity());
//delete all table values
callDao.clean();
Something sm = new Something("test1", "test2");
ArrayList<Something> list = new ArrayList<>();
list.add(sm);
list.add(sm);
//insert new values
callDao.insertInDB(list);
//get all new values in DB
callDao.findAll()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(res -> {
//here gives me a IndexOutOfBoundsException
Log.d("logDebug", res.get(0).getCodeExemple());
});
}
也欢迎对我的代码进行任何更正 :),但主要问题是 delete 方法会删除所有新的插入值,它应该只删除旧值。
【问题讨论】:
-
不使用Query,而是使用@Delete注解删除单个项目并将Item对象作为参数传递
-
@deepakkumar,我想删除所有表格内容,而不是单个项目..
-
抱歉,我理解错了,但是在插入或删除方法删除所有 tge 新值后执行 dele 的真正问题是什么??
-
我的问题是:删除方法在我插入新值之前被调用,但是在我插入新值之后它正在执行。
-
可能是因为日程安排,但您可以通过等待操作完成来避免这种情况,方法是使用 Kotlin 协程中的 await 方法等待异步完成。
标签: android kotlin rx-java2 android-room