2010-10-25 20 views
24

Estoy tratando de obtener el último rowid insertado desde una base de datos sqlite en Android. He leído un montón de publicaciones al respecto, pero no puedo hacer que una funcione. Este es mi método:Obtener el último valor insertado de la base de datos sqlite Android

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

He tratado con Max, pero debe utilizar mal. ¿Hay otra manera?

+1

El método de inserción devuelve rowId o -1 http://stackoverflow.com/questions/5409751/get-generated-id-after-insert – rds

+0

ver https://stackoverflow.com/a/40962443/1770868 –

Respuesta

61

Bueno, en realidad la clase SQLiteDatabase tiene su propio método de inserción que devuelve el id de la fila recién creada. Creo que esta es la mejor manera de obtener la nueva identificación. Puede consultar su documentación here.

Espero que esto ayude.

+1

@Georgi: BIG BIG ayuda para mí. Gracias :) – Bastaix

+0

Me alegra que puedo ayudar;) –

+0

+1 gracias ... simplemente recto es ... mató a dos pájaros de un tiro ... :) –

24

Uso

SELECT last_insert_rowid(); 

para conseguir la última rowid insertado. Si está utilizando AUTOINCREMENT palabra clave entonces

SELECT * from SQLITE_SEQUENCE; 

le dirá los valores para cada mesa.

+1

Tengo un clase DataHelper donde tengo todos los métodos que tratan con la base de datos. He visto estos métodos como este en muchos foros y en la documentación, pero no entiendo cómo se usan. ¿Los usas dentro de la clase DataHelper, o dentro del Sqlite real de la terminal? Lo siento si soy vago, ¡solo estoy tratando de resolver esto! – kakka47

+3

puedes hacer una materia prima con la SQLiteDatabase de Android y darle la cadena "Select * from SQLITE_SEQUENCE" – schwiz

1

Prueba esto:

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

Pensé que las nuevas adiciones a la base de datos SQLite se agregan debajo de las filas existentes en una columna (s). Por lo tanto, la última inserción sería la fila inferior en una columna y, por lo tanto, ¿le gustaría usar "... cursor.moveToLast() ..." en lugar de "... cursor.moveToFirst() ..."? – AJW

2

Si desea que el LAST_INSERT_ID simplemente afert un inserto puede utilizar este último:

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); 
} 
+0

¿Es eso correcto? No estoy a la altura de las especificaciones, así que pregunto. La documentación indica que row_id es devuelto. Hasta donde yo sé, el sqlite row_id no es exactamente el mismo que el valor en la columna de autoincrement o ¿me equivoco al respecto? –

13

para conseguir la última fila de la tabla ..

Cursor cursor = theDatabase.query(DATABASE_TABLE, columns,null, null, null, null, null); 
cursor.moveToLast(); 
+1

Esto me parece la respuesta de rendimiento más fácil y rápida. –

0

El método devuelve el inserto Identificación de la fila recién insertada o -1 si hubo un error durante la inserción.

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

db es una instancia de su SQLiteDatabase.

1

Use moveToLast() en Cursor interfaz.

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

ejemplo 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 
} 

O puede obtener la última fila cuando (se han mencionado, que es @GorgiRankovski) de inserción:

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 

También su es una forma múltiple de hacerlo con la consulta:

  1. Uno se expresa por @DiegoTorresMilano
  2. SELECT MAX(id) FROM table_name. o para obtener todos los valores de las columnas SELECT * FROM table_name WHERE id = (SELECT MAX(id) FROM table_name).
  3. Si su PRiMARY KEY se han sentado a AUTOINCREMENT, puede SELECT vaules occording al máximo a min y limitar las filas a 1 utilizando SELECT id FROM table ORDER BY column DESC LIMIT 1 (Si desea todos y cada valor, utilice * en lugar de id)
Cuestiones relacionadas