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

时间:2017-05-29 14:08:21

标签: android android-room android-architecture-components

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

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

12 个答案:

答案 0 :(得分:309)

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

@Dao 
interface MyDao {
    @Query("DELETE FROM myTableName")
    public void nukeTable();
}

答案 1 :(得分:67)

从会议室1.1.0开始,您可以使用clearAllTables()

  

将所有注册到此数据库的表中的所有行删除为entities()。

答案 2 :(得分:16)

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

@Dao
public interface myDao{
    @Delete
    void delete(MyModel model);
}

更新:如果您要删除完整的表格,请调用以下功能

  @Query("DELETE FROM MyModel")
  void delete();

注意:此处 MyModel 是表名。

答案 3 :(得分:5)

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


                }
            });

答案 4 :(得分:5)

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

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

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

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

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

答案 5 :(得分:1)

结合Dick Lucas所说的内容,并从其他StackOverFlow帖子中添加一个重置自动增量功能,我认为这可以工作:

    fun clearAndResetAllTables(): Boolean {
        val db = db ?: return false

        // reset all auto-incrementalValues
        val query = SimpleSQLiteQuery("DELETE FROM sqlite_sequence")

        db.beginTransaction()
        return try {
            db.clearAllTables()
            db.query(query)
            db.setTransactionSuccessful()
            true
        } catch (e: Exception){
            false
        } finally {
            db.endTransaction()
        }
    }

答案 6 :(得分:1)

使用 RxJava 在后台执行此任务时,我在删除所有方法时遇到问题。这是我终于解决的方法:

@Dao
interface UserDao {
    @Query("DELETE FROM User")
    fun deleteAll()
}

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

答案 7 :(得分:1)

这就是我在Kotlin中所做的事情。

  1. 使用DI(Koin)在活动中注入房间db。

     private val appDB: AppDB by inject()
    
  2. 然后您可以简单地调用clearAllTables()

private fun clearRoomDB() {
    GlobalScope.launch {
        appDB.clearAllTables()
        preferences.put(PreferenceConstants.IS_UPLOADCATEGORIES_SAVED_TO_DB, false)
        preferences.put(PreferenceConstants.IS_MEMBERHANDBOOK_SAVED_TO_DB, false)
    }
}

答案 8 :(得分:0)

要在不滥用@Query注释的情况下使用会议室,请首先使用@Query选择所有行并将它们放在列表中,例如:

@Query("SELECT * FROM your_class_table")

List`<`your_class`>` load_all_your_class();

将其列表放入删除批注中,例如:

@Delete

void deleteAllOfYourTable(List`<`your_class`>` your_class_list);

答案 9 :(得分:0)

如果有人要删除所有表,请刷新应用程序中的所有内容,无需任何代码跟随
Device File Explorer -> data -> data -> com.YOUR_APP -> databases
您可以删除 databases 文件夹内的文件

答案 10 :(得分:0)

如果您使用的是 Rx,则可以这样做。

@Query("DELETE FROM yourDB")
void delete(); : Completable 

答案 11 :(得分:0)

在您的数据库实例调用上

<块引用>

clearAllTables()