Получить последнее вставленное значение из базы данных sqlite Android - PullRequest
24 голосов
/ 25 октября 2010

Я пытаюсь получить последний вставленный rowid из базы данных sqlite в Android.Я прочитал много сообщений об этом, но не могу заставить один работать.Это мой метод:

 public Cursor getLastId() {
        return mDb.query(DATABASE_TABLE, new String[] {KEY_WID}, KEY_WID + "=" + MAX(_id), null, null, null, null, null);}

Я пробовал с MAX, но я должен использовать его неправильно.Есть ли другой способ?

Ответы [ 8 ]

64 голосов
/ 08 июня 2011

Ну, на самом деле класс SQLiteDatabase имеет собственный метод вставки, который возвращает идентификатор вновь созданной строки. Я думаю, что это лучший способ получить новый идентификатор. Вы можете проверить его документацию здесь .

Надеюсь, это поможет.

26 голосов
/ 26 октября 2010

Используйте

 SELECT last_insert_rowid();

, чтобы получить последний вставленный идентификатор строки.Если вы используете ключевое слово AUTOINCREMENT, то

SELECT * from SQLITE_SEQUENCE;

сообщит вам значения для каждой таблицы.

14 голосов
/ 29 июня 2012

Чтобы получить последний ряд из таблицы ..

Cursor cursor = theDatabase.query(DATABASE_TABLE, columns,null, null, null, null, null);
cursor.moveToLast();
2 голосов
/ 29 марта 2012

Если вы хотите, чтобы 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);
}
1 голос
/ 16 июля 2017

Использование moveToLast() в Cursor интерфейсе.

С 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. Один выражается @ 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 vaules occording до макс. / Мин. И ограничить ряды до 1, используя SELECT id FROM table ORDER BY column DESC LIMIT 1 (Если вам нужно каждое значение, используйте * вместо id)
1 голос
/ 11 ноября 2011
/**
 * @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 голос
/ 07 июня 2011

Попробуйте это:

public Cursor getLastId() {
        return mDb.query(DATABASE_TABLE, new String[] { **MAX(id)** }, null, null, null, null, null, null);}
0 голосов
/ 26 февраля 2017

Метод вставки возвращает идентификатор только что вставленной строки или -1, если во время вставки произошла ошибка.

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

db - это экземпляр вашей базы данных SQLiteDatabase.

...