我如何重置sqlite中的自动增量序列号

如何更新Ormlite中的表sqlite_sequence? 我只需要更新seq。 我怎样才能通过ORMLite获得该表?

编辑

我找不到ORLite工具来做这个,所以我使用简单的sqlite查询。 在我的类扩展OrmLiteSqliteOpenHelper我使用SQLiteDatabase进行更新。

EDIT2;)

在我的项目中,我坚持课堂和类WeekDefinition。

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; ... } 

现在,当我添加新的课程,id是增量。 例如

 id = 1 Math id = 2 English id = 3 Medicine 

并在周定义:

 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 

SQLite将这一行添加到sqlite_sequence(当使用自动增量)

 rowId = 1 name = lesson seq = 3 rowId = 2 name = weekDefinition seq = 12 

现在,我删除表Lesson和WeekDefinition中的所有行。 之后Lesson和WeekDef是空的,但是sqlite_sequence仍然是一样的。 这是问题,因为表课程中的id从值4开始(seq来自sqlite_sequence for lesson并添加1):

 id = 4 Math id = 5 English id = 6 Medicine 

和weekDefinition

 id = 13 lesson_id = 1 nr = 20 id = 14 lesson_id = 1 nr = 22 id = 15 lesson_id = 2 nr = 32 

和课程id = 4,math我应该得到weekDefinitios,但在weekDefinitions lessons_id有价值只有1至3这是我的问题。 我需要“重置”sqlite_sequence表(或有更好的解决scheme?)

Solutions Collecting From Web of "我如何重置sqlite中的自动增量序列号"

build立在马科斯·瓦斯康塞洛斯的回答 :

 UPDATE sqlite_sequence SET seq = (SELECT MAX(col) FROM Tbl) WHERE name="Tbl" 

该查询将seq设置为Tbl表中col标识列中的Tbl ,因此不存在违反约束的风险。

在你的.db文件里有一个名为sqlite_sequence的表

每一行都有两列'name',这是表'seq'的一个整数,表示当前表中的最后一个值

您可以将其更新为0

但要小心,如果你的表使用这个ID作为唯一的标识符。

UPDATE SQLITE_SEQUENCE SET SEQ ='value'WHERE NAME ='table_name';

哦,我现在明白了。 如果要在ORMLite中发出通用数据库命令,可以使用updateRaw方法。 看到javadocs 。 其他命令也有executeRaw

 lessonDao.updateRaw("delete from 'lesson';"); lessonDao.updateRaw("delete from sqlite_sequence where name='lesson';"); weekDefinitionDao.updateRaw("delete from 'weekdefinition';"); weekDefinitionDao.updateRaw( "delete from sqlite_sequence where name='weekdefinition';"); 

您也可以删除并重新创build表格:

 TableUtils.dropTable(WeekDefinition.class); TableUtils.dropTable(Lesson.class); TableUtils.createTable(Lesson.class); TableUtils.createTable(WeekDefinition.class); 

我认为真正的问题是为什么你的应用程序依赖于这个数据库的内部数字? 它真的不应该在意。

  • 如何不显示数字,所以它可以是1或1001,你的应用程序将无关紧要?
  • 你也可以永远删除课程,但可能会添加一个隐藏的布尔值字段。 所以,如果他们被重新添加,隐藏的字段可以被设置为false, Math仍然在ID#1。