11

如何在 Ormlite 中更新表 sqlite_sequence?我只需要更新序列。如何通过 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;
    ...
}

现在,当我添加新课程时,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 开始(课程的 sqlite_sequence 的 seq 并添加 1):

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

和周定义

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

对于课程 id = 4 ,数学我应该得到 weekDefinitios,但在 weekDefinitions 中,课程 ID 的值只有 1 到 3 这就是我的问题。我需要“重置” sqlite_sequence 表(或者有更好的解决方案?)

4

5 回答 5

24

Building on Marcos Vasconcelos' answer:

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

This query will set seq to the largest value in the col identity column in the Tbl table, so there is no risk of violating constraints.

于 2013-01-12T22:08:20.520 回答
11

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

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

您可以将其更新为0

但请注意,如果您的表使用此 id 作为唯一标识符。

于 2011-04-08T19:45:27.613 回答
4
UPDATE SQLITE_SEQUENCE SET SEQ= 'value' WHERE NAME='table_name';
于 2016-09-19T12:13:45.670 回答
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。
于 2011-04-08T19:04:57.320 回答
0

这在我的数据库中对我有用:(我在一个之前设置 id,然后在删除一行之后,当我再次添加新数据行时,自动递增序列保持正常):

 public void  updateSerialNumber ( long memberId){
        String query = "UPDATE SQLITE_SEQUENCE SET SEQ= '"+(memberId-1)+"' WHERE NAME='"+ReportBigHelper.TABLE_MEMBER+"'";
        database.execSQL(query);
    }
于 2020-11-04T08:10:14.597 回答