我有一种情况,我希望能够使用Android Room硬重置我的数据库.使用SQLiteOpenHelper,我可以通过编写一个方法来删除所有表和索引,然后手动调用SQLiteOpenHelper.onCreate().
我知道我可以访问一个SupportSQLiteOpenHelper通风室并自己丢弃所有表格,但似乎没有一个好方法来启动娱乐过程.
另外,我知道我可以删除每个表中的每个项目而不删除它,但这不是我想要的.这不会重置自动递增主键,因此新项目的"id"字段不会重置为1.
谢谢!
编辑:
这是我希望能够在运行时任意做的事情.
编辑2:
该方法应该是可维护的,即不涉及手写符合Room行为的SQL.理想情况下,可以通过某种方式检索 Room生成的SQL或SQLiteOpenHelper.onCreate()等效方法.或其他任何解决这个问题的方法!:)
如何在Ormlite中更新表sqlite_sequence?我只需要更新seq.如何通过ORMLite获取该表?
编辑
我找不到ORLite工具来做这个,所以我使用简单的sqlite查询.在我的类扩展OrmLiteSqliteOpenHelper我使用SQLiteDatabase进行更新.
EDIT2;)
在我的项目中,我坚持课课和课堂定义.
class Lesson{
@DatabaseField(generatedId=true)
private int id;
...
}
class WeekDefinitions{
@DatabaseField(generatedId=true)
private int id;
@DatabaseField(foreign=true, columnName="lesson_id")
private Lesson lesson;
...
}
Run Code Online (Sandbox Code Playgroud)
现在,当我添加新课程时,id是递增的.例如
id = 1 Math
id = 2 English
id = 3 Medicine
Run Code Online (Sandbox Code Playgroud)
并在weekDefinition中:
id = 1 lesson_id = 1 nr = 20
id = 2 lesson_id = 1 nr = 22
id = 3 lesson_id = 2 nr = 32
...
id = 12 lesson_id = 3 nr = 3
Run Code Online (Sandbox Code Playgroud)
SQLite将此行添加到sqlite_sequence中(使用autoincrement时)
rowId = …Run Code Online (Sandbox Code Playgroud) 我需要截断房间数据库中的一个表。或者我需要将自动增量键重置为 0。有什么办法可以做到这一点。
以下代码不会将自动增量 ID 重置/清除为 0
database = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, DatabaseMeta.DB_NAME)
.build();
database.query("DELETE FROM sqlite_sequence WHERE name = ?", new Object[]{"tableName"});
Run Code Online (Sandbox Code Playgroud)
或者
database.query("REPLACE INTO sqlite_sequence (name, seq) VALUES ('mission', -1)", null);
Run Code Online (Sandbox Code Playgroud)
无论如何要清除sqlite_sequenceAndroid房间吗?
我认为,Android 房间没有使用“sqlite_sequence”进行自动递增逻辑,我不确定。尝试打印sqlite_sequence条目,找不到我使用的表名(具有自动递增主键)。
如果用户从应用程序注销,我将使用以下命令一一清除表中的数据
@Query("DELETE FROM tableName")
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用下面的代码一一清除所有表的 sqlite_sequence 。
database = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, DatabaseMeta.DB_NAME)
.build();
database.query("DELETE FROM sqlite_sequence WHERE name = ?", new Object[]{"tableName"})
Run Code Online (Sandbox Code Playgroud)
不幸的是,清算sqlite_sequence不起作用。所以如果用户再次登录,那么起始rowId不会从1开始创建。
还有其他方法可以做到这一点吗?我尝试清除整个数据库,并在用户再次登录后添加新条目。