¿Cómo obtener el último registro de Sqlite?

95

Tengo una mesa question_tabley otra ImageButton( Atrás ). Necesito obtener el último registro insertado de la base de datos después de hacer clic en Atrás .

Mi fila contiene las siguientes columnas: question, optionA, optionB, optionC, optionD, y necesito los datos para su uso en mi Activity. Creo un método en la base de datos pero no funciona.

Aquí hay un código de referencia:

Extracto de MySQLiteHelper.java :

public List<ObjectiveWiseQuestion> getLastInsertQuestion()
{
    // long index = 0;
    List<ObjectiveWiseQuestion>LocwiseProfileList=new ArrayList<ObjectiveWiseQuestion>();
    db = getReadableDatabase();
    Cursor cursor = db.query(
            "sqlite_sequence",
            new String[]{"seq"},
            "name = ?",
            new String[]{TABLE_QUESTION},
            null,
            null,
            null,
            null );

    if (cursor.moveToFirst())
    {
        do {
            ObjectiveWiseQuestion owq= new ObjectiveWiseQuestion();

            owq.setQuestion(cursor.getString(2));
            owq.setOptionA(cursor.getString(3));
            owq.setOptionB(cursor.getString(4));
            owq.setOptionC(cursor.getString(5));
            owq.setOptionD(cursor.getString(6));
            owq.setCorrectOption(cursor.getString(7));
            LocwiseProfileList.add(owq);
        } while(cursor.moveToNext());

        db.close();
    }

    return LocwiseProfileList;
}

OnClickListnerde AddQuestionActivity.java

imgBack.setOnClickListener( new View.OnClickListener() 
{                       
    @Override
    public void onClick(View v) 
    {
        msg();
        emptyFormField();

        try {
            final List<ObjectiveWiseQuestion> LocWiseProfile =  db.getLastInsertQuestion();       

            for (final ObjectiveWiseQuestion cn : LocWiseProfile)
            {   
                db=new MySQLiteHelper(getBaseContext());
                db.getWritableDatabase();
                txtQuestion.setText(cn.getQuestion());
                txtOptionA.setText(cn.getOptionA());
                txtOptionB.setText(cn.getOptionB());
                txtOptionC.setText(cn.getOptionC());
                txtOptionD.setText(cn.getOptionD());
                txtCorrectOption.setText(cn.getCorrectOption());
                db.close();
            }
        } catch(Exception e) {
            e.printStackTrace();
        }           
    }
});

Por favor, dame una pista.

ADM
fuente

Respuestas:

188

Prueba esto:

SELECT * 
    FROM    TABLE
    WHERE   ID = (SELECT MAX(ID)  FROM TABLE);

O

también puede utilizar la siguiente solución:

SELECT * FROM tablename ORDER BY column DESC LIMIT 1;
Hasmukh
fuente
25
Esta es una solicitud muy mala para ese propósito porque sqlitedebería ordenar todos los registros por su identificación (lento) antes de devolver el resultado, Stephen Nguyen dio una solicitud óptima con DESCyLIMIT 1
Artem Zinnatullin
@Hasmukh hola govind aquí ... quiero hacer el menú satélite a la derecha de la esquina inferior ... ¿lo hiciste ...?
Govind Rathod
@Govind aquí está el enlace de referencia, puede ayudarlo, github.com/siyamed/android-sa satellite
menu
@Hasmukh, si supongamos que la identificación de la columna no es solo 'AUTOINCREMENT' sino algo más único ... ¿sigue funcionando esta solución?
Choletski
1
Esta y otras respuestas parecen tener una suposición no declarada de que la columna que están ordenando siempre está aumentando. Eso es cierto para las columnas de autoincremento, pero no todas las tablas tienen una columna como esa.
LarsH
201

Creo que la respuesta principal es un poco detallada, solo usa esto

SELECT * FROM table ORDER BY column DESC LIMIT 1;
Stephen Nguyen
fuente
1
La "respuesta principal" no siempre sigue siendo la respuesta principal. ¿Te refieres a Hasmukh's?
LarsH
a veces da el penúltimo valor por alguna razón desconocida ... la mayoría de las veces funciona bien
MSD
Si la columna está marcada como AUTOINCREMENT, entonces SELECT MAX (ID) es mejor. Usando la CLI, ejecute 'EXPLAIN QUERY PLAN <query>' su consulta da como resultado un escaneo completo de la tabla, mientras que SELECT MAX (ID) resulta en una búsqueda mucho más rápida.
Brian Heilig
23

Para obtener el último registro de su tabla ...

 String selectQuery = "SELECT  * FROM " + "sqlite_sequence";
 Cursor cursor = db.rawQuery(selectQuery, null);
  cursor.moveToLast();
5hssba
fuente
Debe agregar la declaración WHERE = TABLE_NAME cuando su base de datos SQLite tenga más de una tabla
aphoe
@aphoe No necesita WHERE = TABLE_NAME porque "sqlite_sequence" es la referencia de la tabla.
apkisbossin
No conozco ninguna garantía de que el último registro de una consulta no ordenada sea el último registro de la tabla. Apuesto a que esto funciona "a menudo". Sin embargo, no puedes confiar en él.
Anders8
11

Aquí hay un ejemplo simple que simplemente devuelve la última línea sin necesidad de ordenar nada de ninguna columna:

"SELECT * FROM TableName ORDER BY rowid DESC LIMIT 1;"       
user4061742
fuente
8

Si ya tiene el cursor, así es como puede obtener el último registro del cursor:

cursor.moveToPosition(cursor.getCount() - 1);
//then use cursor to read values
waqaslam
fuente
¿Hay una manera de conseguir esto mediante la creación de un cursor en getContentResolver (). query?
ralphgabb
Simplemente puede usar cursor.moveToLast ();
Anant Shah
2

Simplemente simple, puede moverse con Cursor moveToLast (); proporciona el método para pasar al último registro

cursor.moveToLast();
Dilavar Malek
fuente
2

Quería mantener mi tabla mientras tiraba de una fila que me da el último valor en una columna particular de la tabla. Básicamente, estaba buscando reemplazar la LAST()función en Excel y esto funcionó.

, (Select column_name FROM report WHERE rowid = (select last_insert_rowid() from report))
j casillas
fuente
1

Suponga que está buscando la última fila de la tabla dbstr.TABNAME, en una columna INTEGER llamada "_ID" (por ejemplo, BaseColumns._ID), pero podría ser cualquier otra columna que desee.

public int getLastId() {
    int _id = 0;
    SQLiteDatabase db = dbHelper.getReadableDatabase();
    Cursor cursor = db.query(dbstr.TABNAME, new String[] {BaseColumns._ID}, null, null, null, null, null);

    if (cursor.moveToLast()) {
        _id = cursor.getInt(0);
    }

    cursor.close();
    db.close();
    return _id;
}
Zanna
fuente
1

Otra opción es usar SQLites LAST_VALUE() función de la siguiente manera.

Dada esta tabla:

+--------+---------+-------+
| OBJECT |  STATUS |  TIME |
+--------+---------+-------+
|        |         |       |
| 1      |  ON     |  100  |
|        |         |       |
| 1      |  OFF    |  102  |
|        |         |       |
| 1      |  ON     |  103  |
|        |         |       |
| 2      |  ON     |  101  |
|        |         |       |
| 2      |  OFF    |  102  |
|        |         |       |
| 2      |  ON     |  103  |
|        |         |       |
| 3      |  OFF    |  102  |
|        |         |       |
| 3      |  ON     |  103  |
+--------+---------+-------+

Puede obtener el último estado de cada objeto con la siguiente consulta

SELECT                           
    DISTINCT OBJECT,             -- Only unique rows
    LAST_VALUE(STATUS) OVER (    -- The last value of the status column
        PARTITION BY OBJECT      -- Taking into account rows with the same value in the object column
        ORDER by time asc        -- "Last" when sorting the rows of every object by the time column in ascending order
        RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING    -- Take all rows in the patition
    ) as lastStatus
FROM
    TABLE

El resultado se vería así:

+--------+--------------+
| OBJECT |  LAST_STATUS |
+--------+--------------+
|        |              |
| 1      |  ON          |
|        |              |
| 2      |  ON          |
|        |              |
| 3      |  ON          |
+--------+--------------+
Saaru Lindestøkke
fuente
0

en sqlite, hay una tabla llamada sqlite_sequence, esta tabla contiene el nombre de la tabla y su último número de identificación (si la identificación se incrementa automáticamente).

Entonces, para obtener la última fila de una tabla, simplemente coloque:

Select * from TABLENAME where id=(SELECT * from sqlite_sequence where name ='TABLENAME')
briniSoft
fuente
0

Las respuestas anteriores asumen que hay una columna de ID de entero en aumento , por lo que MAX(ID)da la última fila. Pero a veces las claves son de tipo texto , no ordenadas de forma predecible. Entonces, para tomar las últimas 1 o N filas (# Nrows #) podemos seguir un enfoque diferente :

Select * From [#TableName#]  LIMIT #Nrows# offset cast((SELECT count(*)  FROM [#TableName#]) AS INT)- #Nrows#
anefeletos
fuente