如何在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;
...
}
现在,当我添加新课程时,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中(使用autoincrement时)
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表(还是有更好的解决方案?)
你能否请你重新提一下你的问题并提供更多细节Bandzio。 我不知道你在这里问什么。 什么是"sqlite_sequence"? 您是否只想从数据库中的表中获取序列号? 那么你持久存在的对象只有一个生成的id?
Bandzio,你真的应该接受其中一个答案; 两者都很好,已经存在超过6个月
以Marcos Vasconcelos的回答为基础:
UPDATE sqlite_sequence SET seq = (SELECT MAX(col) FROM Tbl) WHERE name="Tbl"
此查询将seq设置为Tbl表中col标识列中的最大值,因此不存在违反约束的风险。
非常感谢我正在寻找的东西
我的更新没有反映在sqlite_sequence表上
@ byteC0de您是否将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';");
您也可以删除并重新创建表格:
TableUtils.dropTable(WeekDefinition.class);
TableUtils.dropTable(Lesson.class);
TableUtils.createTable(Lesson.class);
TableUtils.createTable(WeekDefinition.class);
我认为真正的问题是为什么你的应用程序取决于这个数据库的内部数字?它真的不应该在乎。
怎么样不显示数字,所以它可以是1或1001,你的应用程序无关紧要?
你也可以永远不删除课程,但可能会添加一个隐藏的布尔字段。因此,如果它们被重新添加,隐藏字段可以设置为false,Math仍然是id#1。