如何截断表?

时间:2019-01-14 09:46:07

标签: android database android-room

我需要截断会议室数据库中的表。还是我需要将我的自动增量键重置为0。有什么方法可以做到这一点。

3 个答案:

答案 0 :(得分:0)

https://developer.android.com/reference/android/arch/persistence/room/RoomDatabase#clearAllTables()

注意,这发生在主线程上,并将删除所有表。

要清除一个表,您可以使用DELETE FROM TableName; VACUUM添加一个@Query

答案 1 :(得分:0)

房间(SQLite)中没有TRUNCATE

因此首先执行DELETE FROM TABLE然后 执行UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='TABLE_NAME';以重置AI字段。

@Query("DELETE FROM TABLE_NAME")
    fun deleteTable(): Int

@Query("UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='TABLE_NAME'")
    fun resetTable(): Int

答案 2 :(得分:0)

@Rasel所述,会议室中没有TRUNCATE。简而言之,如果表包含自动生成的标识列,则TRUNCATE TABLE会删除表数据,并且将Identifier列重置为其种子值。与DELETE不同,DELETE仅删除数据,但保留身份。另外还有一个名为DROP的命令,该命令删除一个或多个表定义以及这些表的所有数据,索引,触发器,约束和权限规范。但是很遗憾,Room中不支持TRUNCATE和DROP,它只知道Delete命令。

但是,还有希望之窗!根据sqlite文档,SQLite使用特殊的SQLITE_SEQUENCE表跟踪表曾经拥有的最大ROWID。每当创建包含AUTOINCREMENT列的普通表时,都会自动创建并初始化SQLITE_SEQUENCE表。可以使用普通的UPDATE,INSERT和DELETE语句修改SQLITE_SEQUENCE表的内容。

具有AUTOINCREMENT的列将是rowid列的别名,该列用于唯一标识行。因此,如果您可以更改此表,则可以重置自动增量键! (因此,SQLite会将第一个值设置为1而不是0)

另一个问题是Android Room无法提供意外的行为,该行为不提供对未由类创建的其他表(例如SQLITE_SEQUENCE表)的访问。而且,由于Room不使用SQLiteDatabase-它使用了SupportSQLiteDatabase,因此它将所有调用委派给SQLiteDatabase的实现-在这种情况下,您将无法使用SQLiteDatabase.execSQL()。

所以在这种情况下,我的工作如下:Singletone RoomDatabase类中的一个函数(由Kotlin中的Room +):

        companion object {

        fun resetPointer(nonRoomDb: MyRoomDatabase){

          nonRoomDb.openHelper.writableDatabase.execSQL("DELETE FROM sqlite_sequence")

    }       
}

感谢所有这些链接: