挿入後に生成されたIDを取得する


138

私はAndroidでSQLiteを使用していて、挿入した行の生成されたIDを取得する最良の方法を知りたいです。

インクルード後に検索を実行すると思いますが、最善の方法とは言えません。

回答:


271

このinsertメソッドは、id挿入された行の、または-1挿入中にエラーが発生した場合を返します。

long id = db.insert(...);

ここでdbはSQLiteDatabaseです。


21
スペックを読んだ。「戻り値:新しく挿入された行の行ID、またはエラーが発生した場合は-1」rowIdは、生成されたフィールド「id primary key autoincrement」と同じですか?
Marcos Vasconcelos、2011年

29
はい、同じです。
GrAnd

3
@GrAnd、ただし、テーブルの "start-middle"行をいくつか削除して、生成されたid = nでn番目の行のシーケンスを分割するとどうなるでしょうか。返された行IDは、生成された自動インクリメントIDと同じですか?
UnknownJoe 14年

1
INSERT OR UPDATEを実行してIDを取得する必要がある場合はどうなりますか?
ティモ

1
@UnknownJoeこれは古い投稿だと知っています。しかし、誰かのために役立つかもしれません。行IDと自動インクリメントされたIDは、途中から削除されても同じになります。
Raj kannan Iyyappan 2018年

8

ContentValuesを使用する場合:

 DBHelper db =new DBHelper();// your dbHelper
 ContentValues values = new ContentValues();
  values.put("firstName","Ahmad");
 values.put("lastName","Aghazadeh");
 long insertedId= db.getSQLiteDatabase().insert("user", "", values) ;

クエリ実行が使用する場合 select last_insert_rowid()

String sql = "INSERT INTO [user](firstName,lastName) VALUES (\"Ahmad\",\"Aghazadeh\"); select last_insert_rowid()";
 DBHelper itemType =new DBHelper();// your dbHelper
 c = db.rawQuery(sql, null);
 if (c.moveToFirst())
    result = c.getLong(0);

部屋を使用する場合

@Entity
class User {
    @PrimaryKey(autoGenerate = true)
    public int id;
    //...
}


@Dao
public interface UserDao{
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    long insert(User user);

    // Insert multiple users
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    long[] insert(User... user);
}

5

ソースを確認しました。 insertメソッドは、sqlite3_last_insert_rowid関数を使用してIDを返します。ドキュメントによると:https : //www.sqlite.org/c3ref/last_insert_rowid.html 行IDは非表示の列またはINTEGER PRIMARY KEY宣言されている場合はタイプの列です。

ほとんどのSQLiteテーブル(テーブルを除くWITHOUT ROWID)の各エントリには、「rowid」と呼ばれる一意の 64ビット符号付き整数キーがあります。ROWIDは、明示的に宣言された列でも使用されていない限り、ROWID、OID、または_ROWID_という名前の未宣言の列として常に使用できます。表にタイプの列がある場合、その列はROWIDの別の別名ですINTEGER PRIMARY KEY

_ID通常はデフォルトの列です


1

私はmySQLでこれにかなりの問題を抱えていました.LAST_INSERT_IDはIDを取得するための信頼できる方法ではありません。データベースを操作しているユーザーがいる場合、返されたIDは実行したクエリによって挿入されたIDではない可能性があります。いくつか他のユーザーがこのIDの戻りに影響を与える可能性があります。私たちは毎分平均7000人のユーザーがいるサーバーをハンマーで叩き、いつもつまずきました。

解決策は、挿入したクエリのデータを使用し、そのデータを使用してその結果を検索することでした。とにかく最後のIDを探すリクエストを行っています。したがって、idを取得するために、field = varおよびfield = varのSELECT id FROMテーブルを実行することもできます。クエリのパフォーマンスはわずかですが、より信頼性の高い結果が返されました。


3
これには、各行の列値が一意である(またはほとんど一意である)か、複数のIDを返すリスクがあることが必要です。
Richard Barker

0

最後に挿入された行_idは、を使用して簡単に取得できlast_insert_rowid()ます。サンプルコードは以下の通りです。

/**
 * Return Last inserted row id(auto incremented row) (_id)
 * @return
 */
public int getLastAddedRowId() {
    String queryLastRowInserted = "select last_insert_rowid()";

    final Cursor cursor = database.rawQuery(queryLastRowInserted, null);
    int _idLastInsertedRow = 0;
    if (cursor != null) {
        try {
            if (cursor.moveToFirst()) {
                _idLastInsertedRow = cursor.getInt(0);
            }
        } finally {
            cursor.close();
        }
    }

    return _idLastInsertedRow;

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.