Come ottenere l'ultimo record da Sqlite?


93

Ho un tavolo question_tablee uno ImageButton( Indietro ). Ho bisogno di ottenere l'ultimo record inserito dal database dopo aver fatto clic su Indietro .

Il mio riga contiene le seguenti colonne: question, optionA, optionB, optionC, optionD, e ho bisogno dei dati da utilizzare sul mio Activity. Creo un metodo nel database ma non funziona.

Ecco il codice di riferimento:

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

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

Per favore, dammi qualche suggerimento.

Risposte:


186

Prova questo:

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

O

puoi anche usare la seguente soluzione:

SELECT * FROM tablename ORDER BY column DESC LIMIT 1;

25
Questa è una pessima richiesta a tale scopo perché sqlitedovrebbe ordinare tutti i record in base al loro ID (lento) prima di restituire il risultato, Stephen Nguyen ha fornito una richiesta ottimale con DESCeLIMIT 1
Artem Zinnatullin

@ Hasmukh ciao govind qui .. voglio fare satelitemenu a destra dell'angolo in basso ... l'hai fatto ..?
Govind Rathod

@Govind qui è il link di riferimento, potrebbe aiutarti, github.com/siyamed/android-satellite-menu/issues/3
Hasmukh

@ Hasmukh, se supponiamo che l'id della colonna non sia solo "AUTOINCREMENT" ma qualcos'altro di unico ... sta ancora funzionando questa soluzione?
Choletski

1
Questa e altre risposte sembrano avere un presupposto non dichiarato che la colonna su cui stanno ordinando sia sempre in aumento. Questo è vero per le colonne con incremento automatico, ma non tutte le tabelle hanno una colonna del genere.
LarsH

199

Penso che la risposta migliore sia un po 'prolissa, usa questo

SELECT * FROM table ORDER BY column DESC LIMIT 1;

1
La "risposta migliore" non rimane sempre la risposta migliore. Intendi quello di Hasmukh?
LarsH

a volte dà il penultimo valore per qualche motivo sconosciuto ... il più delle volte funziona bene
MSD

23

Per ottenere l'ultimo record dalla tua tabella ..

 String selectQuery = "SELECT  * FROM " + "sqlite_sequence";
 Cursor cursor = db.rawQuery(selectQuery, null);
  cursor.moveToLast();

Dovresti aggiungere l'istruzione WHERE = TABLE_NAME quando il tuo database SQLite ha più di una tabella
aphoe

@aphoe Non ha bisogno di WHERE = TABLE_NAME perché "sqlite_sequence" è il riferimento alla tabella.
apkisbossin

Non conosco alcuna garanzia che l'ultimo record in una query non ordinata sarà l'ultimo record della tabella. Scommetto che funziona "spesso". Non puoi fare affidamento su di esso però.
Anders8

11

Ecco un semplice esempio che restituisce semplicemente l'ultima riga senza bisogno di ordinare nulla da qualsiasi colonna:

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


8

Se hai già il cursore, ecco come puoi ottenere l'ultimo record dal cursore:

cursor.moveToPosition(cursor.getCount() - 1);
//then use cursor to read values

c'è un modo per ottenerlo attraverso la creazione del cursore su getContentResolver (). query?
ralphgabb

Puoi semplicemente usare cursor.moveToLast ();
Anant Shah

2

Semplicemente semplice, puoi muoverti con Cursor moveToLast (); il metodo prevede di passare all'ultimo record

cursor.moveToLast();

2

Volevo mantenere la mia tabella mentre tiravo in una riga che mi dà l'ultimo valore in una particolare colonna della tabella. In sostanza stavo cercando di sostituire la LAST()funzione in Excel e ha funzionato.

, (Select column_name FROM report WHERE rowid = (select last_insert_rowid() from report))

1

Supponi di cercare l'ultima riga della tabella dbstr.TABNAME, in una colonna INTEGER denominata "_ID" (ad esempio BaseColumns._ID), ma potrebbe essere qualsiasi altra colonna che desideri.

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

in sqlite, c'è una tabella chiamata sqlite_sequence, questa tabella contiene il nome della tabella e il suo ultimo numero ID (se l'id è incrementato automaticamente).

Quindi, per ottenere l'ultima riga in una tabella basta inserire:

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

0

Le risposte precedenti presumono che ci sia una colonna ID intero incrementale , quindi MAX(ID)fornisce l'ultima riga. Ma a volte le chiavi sono di tipo testo , non ordinate in modo prevedibile. Quindi, per prendere le ultime 1 o N righe (# Nrows #) possiamo seguire un approccio diverso :

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

0

Un'altra opzione è usare la LAST_VALUE()funzione SQLites nel modo seguente.

Data questa tabella:

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

È possibile ottenere l'ultimo stato di ogni oggetto con la seguente query

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

Il risultato sarebbe:

+--------+--------------+
| OBJECT |  LAST_STATUS |
+--------+--------------+
|        |              |
| 1      |  ON          |
|        |              |
| 2      |  ON          |
|        |              |
| 3      |  ON          |
+--------+--------------+
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.