web-dev-qa-db-fra.com

Obtenir la dernière valeur insérée dans la base de données sqlite Android

J'essaie d'obtenir le dernier rowid inséré d'une base de données sqlite sous Android. J'ai lu beaucoup d'articles à ce sujet, mais je ne parviens pas à en faire fonctionner un. Voici ma méthode: 

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

J'ai essayé avec MAX, mais je dois l'utiliser mal. Y a-t-il un autre moyen?

24
kakka47

En fait, la classe SQLiteDatabase a sa propre méthode d’insertion qui renvoie l’id de la ligne nouvellement créée. Je pense que c’est le meilleur moyen d’obtenir le nouvel ID . Vous pouvez consulter sa documentation ici .

J'espère que ça aide.

63
Gorgi Rankovski

Utilisation

 SELECT last_insert_rowid();

pour obtenir le dernier rowid inséré . Si vous utilisez le mot clé AUTOINCREMENT,

SELECT * from SQLITE_SEQUENCE;

vous dira les valeurs pour chaque table.

25

Pour obtenir la dernière ligne de la table.

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

Si vous voulez le last_insert_id juste après une insertion, vous pouvez l'utiliser:

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

Utilisez moveToLast() in Cursor interface.

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

Exemple simple:

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
}

Ou vous pouvez obtenir la dernière ligne lorsque l'insertion (mentionnée par @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 

Aussi, il y a plusieurs façons de le faire en utilisant une requête:

  1. One est exprimé par @DiegoTorresMilano
  2. SELECT MAX(id) FROM table_name. ou pour obtenir toutes les valeurs de colonnes SELECT * FROM table_name WHERE id = (SELECT MAX(id) FROM table_name).
  3. Si votre PRiMARY KEY est assis à AUTOINCREMENT, vous pouvez SELECT passer de max à min et limiter les lignes à 1 à l'aide de SELECT id FROM table ORDER BY column DESC LIMIT 1(Si vous voulez chaque valeur, utilisez * au lieu de id)
1
Blasanka

Essaye ça: 

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
Mitsuaki Ishimoto

La méthode insert renvoie l'id de la ligne qui vient d'être insérée ou -1 en cas d'erreur lors de l'insertion.

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

la base de données est une instance de votre base de données SQLite.

0
Anik Dey