web-dev-qa-db-ja.com

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

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

私が考える解決策は、インクルード後に検索を行いますが、最良の方法ではありません。

133

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

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

ここで、dbはSQLiteDatabaseです。

263
GrAnd

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) ;

クエリexecが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);
}
4
Ahmad Aghazadeh

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

したがって、通常はデフォルトの_ID列です

3
Kirill Akhmetov

MySQLでこれにかなりの問題がありました。データベースをハンマーで打つユーザーがいる場合、LAST_INSERT_IDはIDを取得する信頼性の高い方法ではありません他のユーザーがこのIDの返却に影響を与える可能性があります。 1分間に平均7000ユーザーのサーバーがあり、常につまずいていました。

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

1
PHPDev

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

/**
 * 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;

}
0
Rupesh Yadav