从会议室数据库中删除数据

时间:2018-07-26 17:24:24

标签: android rx-java2 android-room

因此,我试图在用户注销时完全清除我的表,但是删除表似乎不存在,并且当另一个用户登录时,旧数据仍然存在。我正在使用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时。我想指出的另一件事是,从表中删除时,还有其他表也具有通过外键链接的数据。

5 个答案:

答案 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();
}