2011-09-27 18 views
11

Duplicar posibles:
Get generated id after insertAndroid SQLite acceder al último Insertar fila Identificación del

Quiero conseguir la última fila Identificación insertada en mi aplicación para Android que utiliza este código:

String query = "SELECT * from SQLITE_SEQUENCE"; 
int createdUserId = Integer.parseInt(dbHelper.executeSQLQuery(query).toString()); 

pero el problema es que arroja una excepción que no puede convertir dbHelper.executeSQLQuery(query).toString() en entero. No soy muy bueno en sqlite, pero creo que esto debería devolver la última identificación de la fila que se insertó ... que definitivamente será int (al menos así lo creo). Entonces, si esta no es la manera correcta, ¿alguien puede por favor guiarme cómo obtener la última identificación de la fila en la aplicación de Android?

Gracias !!!

+0

¿Qué es dbHelper una instancia de? – Squonk

+3

¿Por qué una instrucción 'SELECT' * inserta * algo? Si en realidad * insertas * algo con, digamos 'SQLiteDatabase.insert (...)' obtendrías "el ID de fila de la fila recién insertada, o -1 si se produjo un error". –

+0

@MisterSquonk es una instancia de mi clase DatabaseHelper. –

Respuesta

34

Su stamme SQL devolverá todas las identificaciones de filas, no solo las últimas. Intentar algo como esto ...

SELECT ROWID from SQL_LITE_SEQUENCE order by ROWID DESC limit 1 

También tenga en cuenta que yo creo que la selección de SQL_LITE_SEQUENCE obtendrá el último ID de cualquier tabla, también se puede acceder al SQL_LITE_SEQUENCE al seleccionar ROWID en cualquier mesa, y obtener sólo los ID de esa mesa. IE

SELECT ROWID from MYTABLE order by ROWID DESC limit 1 

Y gracias a MisterSquonk por señalar el siguiente paso en los comentarios, añadiendo aquí para facilitar la referencia más adelante ...

La instrucción de consulta a continuación, devolver un objeto que contiene los resultados del cursor, por lo que para acceder al valor entero que haría algo como esto (voy a sustituyo métodos más comunes para su método de ayuda, sólo por el bien otros)

String query = "SELECT ROWID from MYTABLE order by ROWID DESC limit 1"; 
Cursor c = db.rawQuery(query); 
if (c != null && c.moveToFirst()) { 
    lastId = c.getLong(0); //The 0 is the column index, we only have 1 column, so the index is 0 
} 

(Tenga en cuenta que si bien la documentación de SQL Lite llaman ROWID y entero, es un entero de 64 bits, entonces en Java debe recuperarse como un número largo.)

+0

No atómico, inseguro. EDITAR: quitó el voto a favor, pensé que estaba preguntando otra cosa. –

+0

Existe la posibilidad teórica de que esto no proporcione la respuesta correcta, ya que si se eliminan filas de la base de datos y luego se agregan nuevas filas, después de una cantidad masiva de inserciones el rowid puede alcanzar su límite, en cuyo momento sqlite intentará elegir aleatoriamente ranuras rowid para usar por un tiempo. Si esto sucede, obviamente la última fila insertada no tiene el valor numérico más grande y, por lo tanto, simplemente ordenar los identificadores de filas no será suficiente. [Aumento automático en SQLite] (https://www.sqlite.org/autoinc.html) – Timo

12

¿Desea usar "selectlast_insert_rowid()"? :)

+0

Oye, ¿puedes explicarlo un poco, por favor, cómo ejecutar esto? Lo estoy intentando por la respuesta del codificador flotante, pero no se está ejecutando :( –

+0

Lo siento, pero no estoy seguro de cuál es tu problema. Tal vez deberías abrir una nueva pregunta donde puedas dar más detalles sobre cuál es el problema. – JimmyB

+1

Esto es la consulta correcta: SELECCIONAR ROWID de la orden MYTABLE por ROWID DESC límite 1 –

Cuestiones relacionadas