2011-04-07 44 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';