如何在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表(还是有更好的解决方案?)
答案 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);
我认为真正的问题是为什么您的应用程序取决于此数据库内部编号?它真的不应该在乎。
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);
}