因此,我试图在用户注销时完全清除我的表,但是删除表似乎不存在,并且当另一个用户登录时,旧数据仍然存在。我正在使用RXJava Completables和Room和我的代码类似于以下内容。
mDbManager.deleteAllFromTable(mCompositeDisposable)
.doOnComplete(new Action() {
@Override
public void run() {
//Finish logging out.
}
})
.subscribe();
管理器中的方法如下
@Override
public Completable deleteAllFromTable(final CompositeDisposable compositeDisposable) {
return Completable.fromAction(new Action() {
@Override
public void run() {
mContactDao.deleteAllFromTable();
vacuumTables(compositeDisposable);
}
}).subscribeOn(mSchedulerProvider.io())
.observeOn(mSchedulerProvider.ui());
}
道中的方法看起来像
@Query("DELETE FROM table")
void deleteAllFromTable();
我尝试了以下操作:没有清理数据库并将查询标记为事务,还为删除创建了抽象方法,该方法还清理表并将其标记为事务,但数据仍然存在,并且删除未完成调用doOnComplete时。我想指出的另一件事是,从表中删除时,还有其他表也具有通过外键链接的数据。
答案 0 :(得分:2)
在数据库中
fun clearTables() {
GlobalScope.launch(Dispatchers.IO) {
this@YourDataBase.clearAllTables()
}
}
调用ViewModel中的函数
YourDataBase.getInstance(mContext).clearTables()
答案 1 :(得分:1)
从扩展Roomdatabase的类中调用方法clearAllTables() 从所有表中删除所有以entities()形式注册到该数据库的行。
在此处查看文档 https://developer.android.com/reference/android/arch/persistence/room/RoomDatabase
答案 2 :(得分:1)
代替从表中手动删除所有记录,还可以使用-w
方法,该方法将从所有以RoomDatabase.clearAllTables()
注册到该数据库的表中删除所有行。
有关更多详细信息,请参见此 https://developer.android.com/reference/android/arch/persistence/room/RoomDatabase.html#clearAllTables()
答案 3 :(得分:0)
将clearAllTables()与下面的RXJava一起使用,以避免DECLARE
V_OUTPUT integer;
BEGIN
V_OUTPUT := function1(data_rif);
IF V_OUTPUT <> 0 THEN
-- error handling for function 1
END IF;
V_OUTPUT := function2(data_rif);
IF V_OUTPUT <> 0 THEN
-- error handling for function 2
END IF;
V_OUTPUT := function3(data_rif);
IF V_OUTPUT <> 0 THEN
-- error handling for function 3
END IF;
V_OUTPUT := function4(data_rif);
IF V_OUTPUT <> 0 THEN
-- error handling for function 4
END IF;
return 0;
END;
java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
答案 4 :(得分:0)
我花了一些时间尝试连接Completable和Room数据库,这对我来说很有效。我将对如何清除它的建议表示赞赏:
public void eraseDB(){
Log.d("Story act","delall");
AppDB db = AppDB.getAppDatabase(context);
Completable one = Completable.fromAction(() -> db.clearAllTables());
Completable.concatArray(one).observeOn(Schedulers.single()) // OFF UI THREAD
.doOnSubscribe(__ -> {
Log.w(TAG, "Begin transaction. " + Thread.currentThread().toString());
})
.doOnComplete(() -> {
Log.w(TAG, "Set transaction successful." + Thread.currentThread().toString());
})
.doFinally(() -> {
Log.w(TAG, "End transaction." + Thread.currentThread().toString());
})
.subscribeOn(Schedulers.single())
.observeOn(AndroidSchedulers.mainThread()) // ON UI THREAD
.subscribeWith(new CompletableObserver() {
@Override
public void onSubscribe(Disposable d) {
Log.w(TAG, "onSubscribe." + Thread.currentThread().toString());
}
@Override
public void onComplete() {
Log.w(TAG, "onComplete." + Thread.currentThread().toString());
onDBErased();
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError." + Thread.currentThread().toString());
}
});
}
public void onDBErased(){
FirebaseAuth.getInstance().signOut();
startActivity(new Intent(context, LoginActivity.class));
finish();
}