Wie bekomme ich die letzte Aufnahme von Sqlite?

92

Ich habe einen Tisch question_tableund einen ImageButton( Zurück ). Ich muss den zuletzt eingefügten Datensatz aus der Datenbank abrufen, nachdem ich auf Zurück geklickt habe .

Meine Zeile enthält die folgenden Spalten: question, optionA, optionB, optionC, optionD, und ich brauche die Daten für die Verwendung auf meinem Activity. Ich erstelle eine Methode in der Datenbank, aber sie funktioniert nicht.

Hier ist Code als Referenz:

MySQLiteHelper.java- Extrakt:

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

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

Bitte geben Sie mir einen Hinweis.

ADM
quelle

Antworten:

186

Versuche dies:

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

ODER

Sie können auch folgende Lösung verwenden:

SELECT * FROM tablename ORDER BY column DESC LIMIT 1;
Hasmukh
quelle
25
Dies ist eine sehr schlechte Anfrage für diesen Zweck, da sqlitealle Datensätze nach ihrer ID (langsam) sortiert werden sollten, bevor das Ergebnis zurückgegeben wird. Stephen Nguyen gab eine optimale Anfrage mit DESCundLIMIT 1
Artem Zinnatullin
@Hasmukh hi govind hier .. willst du ein Satellitenmenü rechts von der unteren Ecke machen ... hast du es gemacht ..?
Govind Rathod
@ Govind hier ist der Referenzlink, es kann Ihnen helfen, github.com/siyamed/android-satellite-menu/issues/3
Hasmukh
@Hasmukh, wenn angenommen wird, dass die Spalten-ID nicht nur 'AUTOINCREMENT' ist, sondern etwas anderes Einzigartiges ... funktioniert diese Lösung immer noch?
Choletski
1
Diese und andere Antworten scheinen eine unausgesprochene Annahme zu haben, dass die Spalte, nach der sie sortieren, immer größer wird. Das gilt für Autoincrement-Spalten, aber nicht jede Tabelle hat eine solche Spalte.
LarsH
198

Ich denke, die beste Antwort ist etwas ausführlich. Verwenden Sie diese einfach

SELECT * FROM table ORDER BY column DESC LIMIT 1;
Stephen Nguyen
quelle
1
Die "Top-Antwort" bleibt nicht immer die Top-Antwort. Meinst du Hasmukhs?
LarsH
manchmal gibt es aus einem unbekannten Grund den vorletzten Wert an ... meistens funktioniert es einwandfrei
MSD
23

Um die letzte Aufzeichnung von Ihrem Tisch zu erhalten ..

 String selectQuery = "SELECT  * FROM " + "sqlite_sequence";
 Cursor cursor = db.rawQuery(selectQuery, null);
  cursor.moveToLast();
5hssba
quelle
Sie sollten die Anweisung WHERE = TABLE_NAME hinzufügen, wenn Ihre SQLite-Datenbank mehr als eine Tabelle hat
aphoe
@aphoe Er braucht WHERE = TABLE_NAME nicht, da "sqlite_sequence" die Tabellenreferenz ist.
Apkisbossin
Ich kenne keine Garantie dafür, dass der letzte Datensatz in einer unsortierten Abfrage der letzte Datensatz der Tabelle ist. Ich wette, das funktioniert "oft". Sie können sich jedoch nicht darauf verlassen.
Anders8
11

Hier ist ein einfaches Beispiel, das einfach die letzte Zeile zurückgibt, ohne etwas aus einer Spalte sortieren zu müssen:

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

Wenn Sie den Cursor bereits haben, können Sie auf diese Weise den letzten Datensatz vom Cursor erhalten:

cursor.moveToPosition(cursor.getCount() - 1);
//then use cursor to read values
Waqaslam
quelle
Gibt es eine Möglichkeit, dies durch die Erstellung eines Cursors auf der Abfrage getContentResolver (). zu erreichen?
Ralphphgabb
Sie können einfach cursor.moveToLast () verwenden.
Anant Shah
2

Ganz einfach, Sie können mit Cursor moveToLast () verschieben. Methode bietet, um zum letzten Datensatz zu wechseln

cursor.moveToLast();
Dilavar Malek
quelle
2

Ich wollte meine Tabelle beibehalten, während ich in einer Zeile zog, die mir den letzten Wert in einer bestimmten Spalte in der Tabelle gibt. Ich wollte im Wesentlichen die LAST()Funktion in Excel ersetzen und das hat funktioniert.

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

Angenommen, Sie suchen nach der letzten Zeile der Tabelle dbstr.TABNAME in einer INTEGER-Spalte mit dem Namen "_ID" (z. B. BaseColumns._ID), können aber auch eine beliebige andere Spalte sein.

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

In SQLite gibt es eine Tabelle mit dem Namen sqlite_sequence. Diese Tabelle enthält den Tabellennamen und die letzte ID-Nummer (wenn die ID automatisch inkrementiert wird).

Um die letzte Zeile in einer Tabelle zu erhalten, setzen Sie einfach:

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

Bei den vorherigen Antworten wird davon ausgegangen, dass eine inkrementelle Ganzzahl- ID-Spalte vorhanden ist, sodass MAX(ID)die letzte Zeile angegeben wird. Aber manchmal sind die Schlüssel vom Texttyp und nicht vorhersehbar geordnet. Um also die letzten 1 oder N Zeilen (# Nrows #) zu nehmen, können wir einen anderen Ansatz verfolgen :

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

Eine andere Möglichkeit besteht darin, die SQLites- LAST_VALUE()Funktion folgendermaßen zu verwenden.

Angesichts dieser Tabelle:

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

Mit der folgenden Abfrage können Sie den letzten Status jedes Objekts abrufen

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

Das Ergebnis würde folgendermaßen aussehen:

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