4

このメソッドを使用して、sqlite db の行を削除します。

db.execSQL("delete from "+TABLE_NUMS+" where _ID = '" + this.rowID + "'");

次に、残りの Id を更新してエントリを連続させます。

db.execSQL("UPDATE "+TABLE_NUMS+" set _ID = (_ID - 1) WHERE _ID > "+this.rowID);

それは正常に動作しますが、DB に新しいエントリを追加すると、削除されたエントリが存在するかのように新しいエントリの ID が追加されます。たとえば、1 から 10 までの ID を持つ 10 行があるとします。その後、番号 5 を削除し、 6、行は 1 から 8 になりますが、新しいエントリの ID は 11 になります。したがって、ID シーケンスは 1 から 8 および 11 になります。これを修正するにはどうすればよいですか?

4

4 に答える 4

3

前述の通常の ROWID 選択アルゴリズムは、最大の ROWID 値を使用せず、最大の ROWID を持つテーブル内のエントリを削除しない限り、単調に増加する一意の ROWID を生成します。行を削除したり、最大の ROWID を持つ行を作成したりすると、以前に削除された行の ROWID が新しい行の作成時に再利用され、新しく作成された ROWID が厳密に昇順でなくなる可能性があります。 http://www.sqlite.org/autoinc.html

これがSQLiteの仕組みです。

本当に ID を連続させる必要がある場合は、自動インクリメントを使用しないでください。自分でIDを挿入します。最初に MAX(_ID) を選択して、最後の ID (最大値) を取得できます。

于 2012-07-05T14:49:20.363 に答える
3

SQLite は、特別な SQLITE_SEQUENCE テーブルを使用して、テーブルがこれまでに保持した最大の ROWID を追跡します。そのシーケンスを次のように変更できます。

UPDATE SQLITE_SEQUENCE SET seq = this.ID -1 WHERE name = TABLE_NUMS 

この質問でも同じ機能が尋ねられます。

于 2012-07-05T14:49:41.757 に答える
1

これは、テーブルを作成したときに _ID に自動インクリメントが設定されているためです。したがって、追加するすべての行には、明示的に設定しない限り、自動的に番号が付けられます。どうしても _ID が連続した順序で必要な場合は、自動インクリメントを使用する代わりに、自分で設定することをお勧めします。

リセットする方法は次のとおりです。

delete from your_table;    
delete from sqlite_sequence where name='your_table';

これにより、すべてのデータが削除され、シーケンスがリセットされます。

于 2012-07-05T14:47:50.507 に答える
0

SQLite は、最大の ROWID を特別な SQLITE_SEQUENCE テーブルに保持します。そのテーブルを次のように更新できます。

db.execSQL("UPDATE SQLITE_SEQUENCE SET seq = 0 WHERE NAME = '"+TABLE_NAME+"'"); 

また

そのテーブルを次のように削除します。

db.delete("SQLITE_SEQUENCE","NAME = ?",new String[]{TABLE_NAME});
于 2014-07-08T06:54:52.363 に答える