Androidのsqliteデータベースから最後に挿入されたROWIDを取得しようとしています。私はそれについて多くの記事を読みましたが、機能させることはできません。これは私の方法です:
public Cursor getLastId() {
return mDb.query(DATABASE_TABLE, new String[] {KEY_WID}, KEY_WID + "=" + MAX(_id), null, null, null, null, null);}
MAXで試しましたが、間違って使用しているに違いありません。別の方法はありますか?
実際、SQLiteDatabaseクラスには、新しく作成された行のIDを返す独自のinsertメソッドがあります。これが新しいIDを取得する最良の方法だと思います。ドキュメントを確認できます こちら 。
これがお役に立てば幸いです。
使用する
SELECT last_insert_rowid();
最後に挿入されたROWIDを取得します。 AUTOINCREMENT
キーワードを使用している場合
SELECT * from SQLITE_SEQUENCE;
すべてのテーブルの値を教えてくれます。
テーブルから最後の行を取得するには。
Cursor cursor = theDatabase.query(DATABASE_TABLE, columns,null, null, null, null, null);
cursor.moveToLast();
挿入の直後にlast_insert_idが必要な場合は、それを使用できます。
public long insert(String table, String[] fields, String[] vals )
{
String nullColumnHack = null;
ContentValues values = new ContentValues();
for (int i = 0; i < fields.length; i++)
{
values.put(fields[i], vals[i]);
}
return myDataBase.insert(table, nullColumnHack, values);
}
Cursor
インターフェイスで moveToLast()
を使用します。
_/**
* Move the cursor to the last row.
*
* <p>This method will return false if the cursor is empty.
*
* @return whether the move succeeded.
*/
boolean moveToLast();
_
簡単な例:
_final static String TABLE_NAME = "table_name";
String name;
int id;
//....
Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
if(cursor.moveToLast()){
//name = cursor.getString(column_index);//to get other values
id = cursor.getInt(0);//to get id, 0 is the column index
}
_
または、挿入時に最後の行を取得できます(@GorgiRankovskiが言及している):
_long row = 0;//to get last row
//.....
SQLiteDatabase db= this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COLUMN_NAME, name);
row = db.insert(TABLE_NAME, null, contentValues);
//insert() returns the row ID of the newly inserted row, or -1 if an error occurred
_
また、クエリを使用してこれを行うことができる複数の方法があります:
SELECT MAX(id) FROM table_name
。または、すべての列の値SELECT * FROM table_name WHERE id = (SELECT MAX(id) FROM table_name)
を取得します。PRiMARY KEY
_がAUTOINCREMENT
に座っている場合、SELECT
が最大値から最小値に達する可能性があり、_SELECT id FROM table ORDER BY column DESC LIMIT 1
_を使用して行を1に制限できます。 (すべての値が必要な場合は、id
)ではなく_*
_を使用してくださいこれを試して:
public Cursor getLastId() {
return mDb.query(DATABASE_TABLE, new String[] { **MAX(id)** }, null, null, null, null, null, null);}
/**
* @return
*/
public long getLastInsertId() {
long index = 0;
SQLiteDatabase sdb = getReadableDatabase();
Cursor cursor = sdb.query(
"sqlite_sequence",
new String[]{"seq"},
"name = ?",
new String[]{TABLENAME},
null,
null,
null,
null
);
if (cursor.moveToFirst()) {
index = cursor.getLong(cursor.getColumnIndex("seq"));
}
cursor.close();
return index;
}
Insertメソッドは、挿入されたばかりの行のIDを返します。挿入中にエラーが発生した場合は-1を返します。
long id = db.insert("your insertion statement");
dbは、SQLiteDatabaseのインスタンスです。