房间坚持图书馆.删除所有

Sir*_*lon 156 android android-room android-architecture-components

如何使用Room Persistence Library删除特定表上的所有条目?我需要删除表,但我无法找到任何信息如何执行此操作.

仅在数据库迁移或加载所有条目并删除它们时:)

yig*_*git 378

您可以创建一个DAO方法来执行此操作.

@Dao 
interface MyDao {
    @Query("DELETE FROM myTableName")
    public void nukeTable();
}
Run Code Online (Sandbox Code Playgroud)

  • 好名字!Nuke表:))) (10认同)
  • @yigit有没有办法找出查询是否成功运行或是否有错误? (5认同)
  • 小心!至于房间alpha4版本,这种技术将导致gradle构建失败:https://issuetracker.google.com/issues/63608092 (4认同)
  • 啊,我没有想到这一点.我假设`@ Query`仅限于返回结果集的东西(类似于`rawQuery()`).很酷! (3认同)
  • “ID”怎么样?我确实喜欢这个,但表 ID 继续增加。在实际表中,删除 ID 也被删除以再次从 0 开始。 (2认同)

Dic*_*cas 81

从Room开始,1.1.0你可以使用clearAllTables():

从作为entities()注册到此数据库的所有表中删除所有行.

  • 注意:clearAllTables()是异步的,没有办法告诉它什么时候完成. (28认同)
  • @Alexey,但是在clearAllTables之后尝试保存内容是否会有任何麻烦?像这样,它只会尝试插入AFTER清除之后吗?因为我很好。 (2认同)
  • @FirstOne clearAllTables基本上只是在新的后台线程上启动事务。它从表中删除所有数据,然后提交该事务。如果您在clearAllTables启动事务之前启动事务,则可以。话虽如此,如果您尝试在调用clearAllTable之后立即插入一些数据,则您的插入可能会在clearAllTable开始事务之前开始,并且您将丢失所有数据。如果您需要在调用clearAllTable之后立即插入新数据,请至少添加一些延迟。 (2认同)
  • @Alexey 有没有办法使用回调方法或类似方法来确定删除事务的状态?换句话说,如果删除事务状态完成,则继续插入数据方法。 (2认同)
  • “clearAllTables()”不会异步操作,但它会强制您不要从主线程调用它。 (2认同)

Ama*_*TeR 22

如果要从Room中的表中删除条目,只需调用此函数,

@Dao
public interface myDao{
    @Delete
    void delete(MyModel model);
}
Run Code Online (Sandbox Code Playgroud)

更新:如果你想删除完整的表,请调用以下函数,

  @Query("DELETE FROM MyModel")
  void delete();
Run Code Online (Sandbox Code Playgroud)

注意:这里MyModel是表名.


小智 8

如下所示,将clearAllTables()与RXJava一起使用以避免java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.

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


                }
            });
Run Code Online (Sandbox Code Playgroud)


Mic*_*cer 6

使用RxJava在后台执行此任务时,我遇到了 delete all 方法的问题。这就是我最终解决它的方法:

@Dao
interface UserDao {
    @Query("DELETE FROM User")
    fun deleteAll()
}
Run Code Online (Sandbox Code Playgroud)

fun deleteAllUsers() {
    return Maybe.fromAction(userDao::deleteAll)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe ({
            d("database rows cleared: $it")
        }, {
            e(it)
        }).addTo(compositeDisposable)
}
Run Code Online (Sandbox Code Playgroud)

  • 当您使用 Kotlin 时,您可以将其包装在 `thread {}` 中,而不是使用 RxJava (5认同)

Gil*_*oot 6

这就是我们如何从片段中做到这一点。

fun Fragment.emptyDatabase() {
    viewLifecycleOwner.lifecycleScope.launchWhenCreated {
        withContext(Dispatchers.IO) {
            Database.getInstance(requireActivity()).clearAllTables()
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

如果您要从活动中清空数据库,请使用以下命令:

fun Activity.emptyDatabase() {
    // create a scope to access the database from a thread other than the main thread
    val scope = CoroutineScope(Dispatchers.Default)
    scope.launch {
        SitukaDatabase.getInstance(this@emptyDatabase).clearAllTables()
    }
}
Run Code Online (Sandbox Code Playgroud)

也可以clearAllTables从主线程调用该方法。我还没有尝试过,但我注意到 Android Studio 无法将调用识别为挂起函数。