11

Ormlite でテーブル sqlite_sequence を更新するには? 更新シーケンスが必要です。ORMLite を介してそのテーブルを取得するにはどうすればよいですか?

編集

これを行うための ORLite ツールが見つからないため、代わりに単純な sqlite クエリを使用します。私のクラスでは OrmLiteSqliteOpenHelper を拡張し、SQLiteDatabase を使用してその更新を行います。

EDIT2 ;)

私のプロジェクトでは、クラス Lesson とクラス 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 に追加します ( autoincrement を使用する場合)

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 の場合、Math は weekDefinitios を取得する必要がありますが、weekDefinitions では、lesses_id の値は 1 から 3 までしかありません。これが私の問題です。sqlite_sequence テーブルを「リセット」する必要があります (または、より良い解決策がありますか?)

4

5 に答える 5

24

マルコス・バスコンセロスの答えに基づいて構築:

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

このクエリは、テーブルの ID 列seqの最大値に設定されるため、制約に違反するリスクはありません。colTbl

于 2013-01-12T22:08:20.520 に答える
11

.dbファイル内には、というテーブルがありますsqlite_sequence

各行には2つの列 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 で一般的なデータベース コマンドを発行する場合は、メソッドを使用できますupdateRawjavadocを参照してください。他のコマンド用もあり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 に答える