私はAndroidでSQLiteを使用していて、挿入した行の生成されたIDを取得する最良の方法を知りたいです。
インクルード後に検索を実行すると思いますが、最善の方法とは言えません。
私はAndroidでSQLiteを使用していて、挿入した行の生成されたIDを取得する最良の方法を知りたいです。
インクルード後に検索を実行すると思いますが、最善の方法とは言えません。
回答:
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);
}
ソースを確認しました。
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
通常はデフォルトの列です
私はmySQLでこれにかなりの問題を抱えていました.LAST_INSERT_IDはIDを取得するための信頼できる方法ではありません。データベースを操作しているユーザーがいる場合、返されたIDは実行したクエリによって挿入されたIDではない可能性があります。いくつか他のユーザーがこのIDの戻りに影響を与える可能性があります。私たちは毎分平均7000人のユーザーがいるサーバーをハンマーで叩き、いつもつまずきました。
解決策は、挿入したクエリのデータを使用し、そのデータを使用してその結果を検索することでした。とにかく最後のIDを探すリクエストを行っています。したがって、idを取得するために、field = varおよびfield = varのSELECT id FROMテーブルを実行することもできます。クエリのパフォーマンスはわずかですが、より信頼性の高い結果が返されました。
最後に挿入された行_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;
}