Android 房间持久性图书馆。全部删除

Android 房间持久性图书馆。全部删除,android,android-room,android-architecture-components,Android,Android Room,Android Architecture Components,如何使用文件室持久性库删除特定表上的所有条目? 我需要放下桌子,但我找不到任何信息如何做 @Dao interface MyDao { @Query("DELETE FROM myTableName") public void nukeTable(); } 仅当数据库正在迁移或要加载所有条目并删除它们时:您可以创建一个DAO方法来执行此操作 @Dao interface MyDao { @Query("DELETE FROM myTableName") pu

如何使用文件室持久性库删除特定表上的所有条目? 我需要放下桌子,但我找不到任何信息如何做

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

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

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

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

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

@Dao
public interface myDao{
    @Delete
    void delete(MyModel model);
}
更新:如果要删除完整的表,请调用下面的函数

  @Query("DELETE FROM MyModel")
  void delete();
注意:这里MyModel是一个表名。

从1.1.0房间开始,您可以使用它:

从作为实体注册到此数据库的所有表中删除所有行

结合其他StackOverFlow帖子的内容和添加reset autoincremental,我认为这是可行的:

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()
    }
}
为了避免java.lang.IllegalStateException:无法访问主线程上的数据库,因为它可能会长时间锁定UI


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

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


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

@查询从您的_class_表中选择*


以下是我在科特林的表现

使用DI Koin在活动中注入房间db

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


这是我们如何从一个片段中进行的

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没有将该调用识别为挂起功能。

如果有人想删除所有表,请刷新应用程序中的所有内容,无需任何代码 设备文件管理器->数据->数据->com.YOUR\u应用程序->数据库 您可以删除数据库文件夹中的文件

如果您正在使用Rx,您可以这样做

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

啊,我没想到。我假设@Query仅限于返回类似于rawQuery的结果集的内容。很酷@yigit我可以请求@Delete不带任何参数并从表中全部删除吗?我在找房间的追踪器把它归档…小心!对于room alpha4版本,这种技术将导致gradle构建失败:Ids如何?我确实喜欢这样,但表ID继续增加。在实际表中,drop ID也会被删除,以再次从0开始。@yigit是否有办法确定查询是否成功运行或是否有错误?从1.1.0房间开始,您可以使用clearAllTables,它会删除作为实体注册到此数据库的所有表中的所有行。我已经在下面给出了答案,但为了便于查看,我在这里进行了复制。请注意:clearAllTables是异步的,无法判断它何时完成。@Alexey但是在clearAllTables之后尝试保存某些内容会有任何问题吗?与中一样,它是否仅在清除后尝试插入?因为我没意见。@FirstOne clearAllTables基本上只是在一个新的后台线程上启动一个事务。它从表中删除所有数据,然后提交该事务。如果您启动事务的时间晚于clearAllTables启动它的时间,那么您就没事了。这就是说,若您试图在调用clearAllTable之后立即插入一些数据,那个么您的插入可能会在clearAllTable开始事务之前开始,并且您将丢失所有数据。如果您需要在调用clearAllTable后立即插入新数据,请至少添加一些延迟。@Alexey是否有任何方法可以使用回调方法或类似方法来确定删除事务的状态?换句话说,如果删除事务状态已完成,则继续执行插入数据方法。@AJW否,到目前为止,仍然无法判断操作何时完成。如果您确实需要此功能,您可能希望尝试类似于从sqlite_master WHERE type='table'中选择名称,然后手动从{table}中删除。不过我还没有测试过。值得一提的是,我发现通过context.deleteDatabase“name”最容易做到这一点,然后在第一次访问时通过Room.databaseBuilder.addCallback简单地重新启动和重新填充数据库。什么是sqlite_序列?当您使用Kotlin时,您可以将其包装在线程{}在使用更新代码错误后,我没有使用RxJavai进行futzing,而是得到了这个错误:抽象DAO方法必须使用以下注释中的一个(并且只能使用其中一个)进行注释:Insert、Delete、Query、update、RawQuery void Delete;
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)
    }
}
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()
    }
}
@Query("DELETE FROM yourDB")
void delete(); : Completable