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

时间:2011-04-07 19:08:03

标签: android sqlite ormlite

如何在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

并在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

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

并且对于lesson id = 4,Math i应该得到weekDefinitios,但是在weekDefinitions中,lessons_id的值仅为1到3 这是我的问题。我需要“重置”sqlite_sequence表(还是有更好的解决方案?)

5 个答案:

答案 0 :(得分:20)

建立于Marcos Vasconcelos'answer

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

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

答案 1 :(得分:9)

在.db文件中有一个名为sqlite_sequence

的表

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

您可以将其更新为0

但请注意,您的表是否使用此ID作为唯一标识符。

答案 2 :(得分:1)

如果要在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';");

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

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

我认为真正的问题是为什么您的应用程序取决于此数据库内部编号?它真的不应该在乎。

  • 如何不显示号码,所以它可以是1或1001,你的申请无关紧要?
  • 你也可能永远不会删除课程,但可能会添加一个隐藏的布尔字段。因此,如果重新添加,隐藏字段可能设置为false,Math仍然位于ID#1。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

这在我的数据库中为我工作:(我将id设置为1,然后删除一行后,当我再次添加新数据行时,自动递增序列仍然可以):

 public void  updateSerialNumber ( long memberId){
        String query = "UPDATE SQLITE_SEQUENCE SET SEQ= '"+(memberId-1)+"' WHERE NAME='"+ReportBigHelper.TABLE_MEMBER+"'";
        database.execSQL(query);
    }