我需要截断会议室数据库中的表。还是我需要将我的自动增量键重置为0。有什么方法可以做到这一点。
答案 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")
}
}
感谢所有这些链接: