1

以下の表 myTable の行 ID をリサイクルしたくないとします。

そのために、次を定義します。

CREATE TABLE myTable
(
  id INTEGER PRIMARY KEY AUTOINCREMENT ,
  <Other columns>
)

次に、Android/SQLite 環境で次の未使用の行 ID を取得します。

どうすれば効率的にそれを行うことができますか?

おそらく、オブジェクト android.database.sqlite.SQLiteDatabase とおそらく(?) オブジェクト android.database.sqlite.SQLiteStatement が必要です。

しかし、このタスクを実行する最も効率的な方法は何ですか?

注: myTable に行を作成したくありません。ただし、もちろん、行を作成して削除するのが最善の方法であれば、行を作成して削除することもできます。

4

5 に答える 5

1

sqlite_sequence テーブルからそのシーケンスの現在の値を読み取ることができます。

于 2013-02-22T16:23:29.487 に答える
1

あなたが特定したように、行を作成して削除することは有効なアプローチです。もう1つの方法は、

SELECT id FROM myTable ORDER BY id DESC

次に、返された最初の行の ID を見て、それを 1 増やします。ただし、同時実行には注意してください。未使用の行をチェックした直後に何かを挿入すると、予期しない動作が発生する可能性があります。

編集: CLの答えをチェックしてください。より実用的です。さらに、そのテーブルのシーケンス番号を手動で更新して、行が使用されないことが保証されるようにすることもできます。

于 2013-02-22T16:24:57.263 に答える
0

なぜ誰かがこれを行う必要があるのか​​理解できませんでしたが、それは可能です。

SQLiteのドキュメントには、auto_incrementの値は、auto_incrementssqlite_sequenceを使用するとデータベースに自動的に作成されるテーブルに格納されると記載されています。

このSOの回答sqlite_sequenceは、現在の最大IDを見つけるためにテーブルをクエリする1つの方法を説明しています。次に、テーブルに1を追加すると、99.9%の確率でこれが次に発行されるIDになります。

于 2013-02-22T16:32:20.863 に答える
0

使用する内部でSQLiteOpenHelper、トランザクションを開始します。データを挿入してからロールバックします。

そのような方法で、次のように次の行 ID を取得できます。

public long nextId() {
    long rowId = -1;

    SQLiteDatabase db = getWritableDatabase();
    db.beginTransaction();
    try {
        ContentValues values = new ContentValues();
        // fill values ...

        // insert a valid row into your table
        rowId = db.insert(TABLE_NAME, null, values);

        // NOTE: we don't call  db.setTransactionSuccessful()
        // so as to rollback and cancel the last changes
    } finally {
        db.endTransaction();
    }
    return rowId;
}
于 2013-09-19T08:09:42.127 に答える
0

したがって、答えは次のようになります。

db.execSQL("UPDATE sqlite_sequence set seq=seq+1 WHERE name='myTable'");

SQLiteStatement st = db.compileStatement("SELECT seq from sqlite_sequence WHERE name='myTable'");
long v = st.simpleQueryForLong();
st.close();

現在、v は未使用の行 ID であり、他の誰も取得できません。おそらく、これらのステートメントは同じトランザクション内にある必要があります。

シンプルで非常に一般的なタスクに対してそれほど単純ではありませんか?

于 2013-02-22T17:30:05.113 に答える