web-dev-qa-db-ja.com

sqliteデータベースから最後に挿入された値を取得Android

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で試しましたが、間違って使用しているに違いありません。別の方法はありますか?

24
kakka47

実際、SQLiteDatabaseクラスには、新しく作成された行のIDを返す独自のinsertメソッドがあります。これが新しいIDを取得する最良の方法だと思います。ドキュメントを確認できます こちら

これがお役に立てば幸いです。

64
Gorgi Rankovski

使用する

 SELECT last_insert_rowid();

最後に挿入されたROWIDを取得します。 AUTOINCREMENTキーワードを使用している場合

SELECT * from SQLITE_SEQUENCE;

すべてのテーブルの値を教えてくれます。

26

テーブルから最後の行を取得するには。

Cursor cursor = theDatabase.query(DATABASE_TABLE, columns,null, null, null, null, null);
cursor.moveToLast();
14
HforHisham

挿入の直後に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);
}
2
user1296132

Cursor インターフェイスで moveToLast() を使用します。

Android.googlesource.com から

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

また、クエリを使用してこれを行うことができる複数の方法があります:

  1. 1つは@DiegoTorresMilanoによって表現されます
  2. SELECT MAX(id) FROM table_name。または、すべての列の値SELECT * FROM table_name WHERE id = (SELECT MAX(id) FROM table_name)を取得します。
  3. _PRiMARY KEY_がAUTOINCREMENTに座っている場合、SELECTが最大値から最小値に達する可能性があり、_SELECT id FROM table ORDER BY column DESC LIMIT 1_を使用して行を1に制限できます。 (すべての値が必要な場合は、id)ではなく_*_を使用してください
1
Blasanka

これを試して:

public Cursor getLastId() {
        return mDb.query(DATABASE_TABLE, new String[] { **MAX(id)** }, null, null, null, null, null, null);}
1
Antonio Tonev
/**
 * @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;
}
1

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

long id = db.insert("your insertion statement");

dbは、SQLiteDatabaseのインスタンスです。

0
Anik Dey