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.

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;

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;

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

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;"       


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

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

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

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

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')

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#

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          |
+--------+--------------+
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.