从Room数据库中删除数据。

6

我试图在用户退出时完全清除我的表格,但是删除表格似乎没有生效,当另一个用户登录时,旧数据仍然存在。我正在使用RXJava Completables和Room,我的代码类似于以下内容。

                        mDbManager.deleteAllFromTable(mCompositeDisposable)
                            .doOnComplete(new Action() {
                                @Override
                                public void run() {
                                    //Finish logging out.
                                }
                            })
                            .subscribe();

Manager中的方法看起来像这样

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

Dao中的方法一般长这样

@Query("DELETE FROM table")
void deleteAllFromTable();

我已经尝试过在不清空数据库的情况下将查询标记为事务,同时创建一个删除抽象方法并清空表格,并将其标记为事务,但是数据仍然存在,当doOnComplete被调用时删除未完成。另外我想指出的是,当从表中删除数据时,还有其他通过外键链接的数据表也会一同删除。


你如何知道数据没有被删除? - Amit Vikram Singh
在Android Studio中使用设备文件浏览器...另外,下一个登录的用户可以看到已注销用户的数据。 - Seef
1
你的数据库表真的叫做“table”吗? - Mark
不要...我这么写只是为了通用性。 - Seef
5个回答

10

8

在数据库中

fun clearTables() {
        GlobalScope.launch(Dispatchers.IO) {
            this@YourDataBase.clearAllTables()
        }
    }

在ViewModel中调用函数

  YourDataBase.getInstance(mContext).clearTables()

2

1
使用RXJava时,可以像下面这样使用clearAllTables()来避免出现java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.错误。请注意保留HTML标签。
Completable.fromAction(new Action() {
    @Override
    public void run() throws Exception {
        getRoomDatabase().clearAllTables();
    }
}).subscribeOn(getSchedulerProvider().io())
        .observeOn(getSchedulerProvider().ui())
        .subscribe(new Action() {
            @Override
            public void run() throws Exception {
                Log.d(TAG, "--- clearAllTables(): run() ---");
                getInteractor().setUserAsLoggedOut();
                getMvpView().openLoginActivity();
            }
        }, new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                Log.d(TAG, "--- clearAllTables(): accept(Throwable throwable) ----");
                Log.d(TAG, "throwable.getMessage(): "+throwable.getMessage());


            }
        });

1

我花了一些时间尝试连接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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接