2011-04-07 269 views
7

如何更新Ormlite中的表sqlite_sequence?我只需要更新seq。我如何通过ORMLite获取该表格?如何重置sqlite中的自动增量序列号

编辑

我找不到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 

现在,我删除表课和WeekDefinition所有行。在此之后,Lesson和WeekDef为空,但sqlite_sequence仍然相同。这是问题,因为ID在表中的教训,从值4开始(SEQ从sqlite_sequence的教训,并添加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,数学我应该得到weekDefinitios,但在周定义lesson_id有价值只有1至3 这是我的问题。我需要“重置”sqlite_sequence表(或有更好的解决方案?)

+1

您能否重新提出您的问题并提供更多详情Bandzio。我不知道你在这里问什么。什么是“sqlite_sequence”?您是否试图从数据库中的表中获取序列号?因此,您持久保存的对象_only_有生成的ID吗? – Gray 2011-04-08 12:26:57

+0

Bandzio,你真的应该接受其中的一个答案;两者都很好,已经有6个多月的时间了 – Noah 2011-10-18 12:25:24

回答

0

哦,我现在明白了。如果您想在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处。
8

你的。数据库文件有称为表sqlite_sequence

每行有两列 name这是表 seq一个整数表明在该表中当前最后一个值

,您可以将其更新到0

名称

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

18

大厦马科斯洛斯answer

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

这个查询将设置seq到在Tblcol标识列中的最大值,所以没有违反约束的风险。

+0

感谢这究竟是我在找什么 – Mirko 2014-05-21 12:01:52

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