如何使用房间持久性库删除特定表上的所有条目? 我需要删除表,但我无法找到如何做到这一点的任何信息。

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


当前回答

如果有人在寻找删除所有的表,刷新一切在应用程序没有任何代码遵循 设备文件资源管理器-> data -> data -> com. com。YOUR_APP ->数据库 您可以删除数据库文件夹中的文件

其他回答

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

您可以创建一个DAO方法来做到这一点。

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

以下是我如何在Kotlin中做到这一点。

使用DI (Koin)在活动中注入房间db。 private val appDB:通过注入() 然后您可以简单地调用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)
    }
}

这是我们如何从一个片段。

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不识别调用为挂起函数。

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

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

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

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

注意:这里MyModel是一个表名。