Como obter o último registro do Sqlite?

93

Eu tenho uma mesa question_tablee uma ImageButton( Voltar ). Preciso obter o último registro inserido do banco de dados após clicar em Voltar .

Minha linha contém as seguintes colunas: question, optionA, optionB, optionC, optionD, e eu preciso os dados para uso no meu Activity. Eu crio um método no banco de dados, mas não está funcionando.

Aqui está o código para referência:

Extrato 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, me dê alguma dica.

ADM
fonte

Respostas:

186

Experimente isto:

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

OU

você também pode usar a seguinte solução:

SELECT * FROM tablename ORDER BY column DESC LIMIT 1;
Hasmukh
fonte
25
Este é um pedido muito ruim para esse propósito porque sqlitedeve classificar todos os registros por seu id (lento) antes de retornar o resultado, Stephen Nguyen deu a solicitação ideal com DESCeLIMIT 1
Artem Zinnatullin
@Hasmukh oi govind aqui .. quero fazer o menu do satélite no canto direito inferior ... você conseguiu ..?
Govind Rathod
@Govind aqui está o link de referência, pode ajudá-lo, github.com/siyamed/android-satellite-menu/issues/3
Hasmukh
@Hasmukh, se supor que o id da coluna não seja apenas 'AUTOINCREMENT', mas algo único ... ainda está funcionando nesta solução?
Choletski
1
Esta e outras respostas parecem ter uma suposição não declarada de que a coluna que estão classificando está sempre aumentando. Isso é verdade para colunas de incremento automático, mas nem toda tabela tem uma coluna como essa.
LarsH 01 de
199

Acho que a principal resposta é um pouco prolixa, basta usar

SELECT * FROM table ORDER BY column DESC LIMIT 1;
Stephen Nguyen
fonte
1
A "melhor resposta" nem sempre é a melhor resposta. Você quer dizer o de Hasmukh?
LarsH 01 de
às vezes está fornecendo o penúltimo valor por algum motivo desconhecido ... na maioria das vezes está funcionando bem
MSD
23

Para obter o último registro da sua mesa ..

 String selectQuery = "SELECT  * FROM " + "sqlite_sequence";
 Cursor cursor = db.rawQuery(selectQuery, null);
  cursor.moveToLast();
5hssba
fonte
Você deve adicionar a instrução WHERE = TABLE_NAME quando seu banco de dados SQLite tiver mais de uma tabela
aphoe
@aphoe Ele não precisa de WHERE = TABLE_NAME porque "sqlite_sequence" é a referência de tabela.
apkisbossin de
Não conheço nenhuma garantia de que o último registro em uma consulta não classificada será o último registro da tabela. Aposto que isso funciona "frequentemente". Você não pode confiar nisso.
Anders8 de
11

Aqui está um exemplo simples que simplesmente retorna a última linha sem a necessidade de classificar nada de qualquer coluna:

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

Se você já tem o cursor, é assim que você pode obter o último registro do cursor:

cursor.moveToPosition(cursor.getCount() - 1);
//then use cursor to read values
waqaslam
fonte
Existe uma maneira de fazer isso por meio da criação do cursor em getContentResolver (). query?
ralphgabb
Você pode simplesmente usar cursor.moveToLast ();
Anant Shah
2

Simplesmente, você pode mover com Cursor moveToLast (); método fornece para mover para o último registro

cursor.moveToLast();
Dilavar Malek
fonte
2

Eu queria manter minha tabela enquanto puxava uma linha que me fornecesse o último valor em uma coluna específica da tabela. Eu estava basicamente procurando substituir a LAST()função no Excel e isso funcionou.

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

Suponha que você esteja procurando pela última linha da tabela dbstr.TABNAME, em uma coluna INTEGER chamada "_ID" (por exemplo BaseColumns._ID), mas pode ser qualquer outra coluna que você desejar.

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
fonte
0

no sqlite, existe uma tabela chamada sqlite_sequence, esta tabela contém o nome da tabela e seu último número de id (se o id for incrementado automaticamente).

Portanto, para obter a última linha de uma tabela, basta colocar:

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

As respostas anteriores presumem que há uma coluna de ID de número inteiro crescente , portanto, MAX(ID)fornece a última linha. Mas às vezes as chaves são do tipo texto , não ordenadas de maneira previsível. Portanto, para obter as últimas 1 ou N linhas (# Nrows #), podemos seguir uma abordagem diferente :

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

Outra opção é usar SQLites LAST_VALUE() função da seguinte maneira.

Dada esta tabela:

+--------+---------+-------+
| 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  |
+--------+---------+-------+

Você pode obter o último status de cada objeto com a seguinte 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

O resultado ficaria assim:

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