it-swarm.com.de

Android SQLite Query - Die letzten 10 Datensätze abrufen

Ich habe eine Datenbank in meiner Android-Anwendung gespeichert und möchte die letzten 10 in die Datenbank eingefügten Nachrichten abrufen.

Wenn ich benutze:

Select * from tblmessage DESC limit 10;

es gibt mir die 10 nachrichten aber vonTOP. Aber ich möchte dieLETZTEN10 Nachrichten. Ist es möglich?

Angenommen, die gesamten Tabellendaten sind -

1,2,3,4,5....30

Ich habe die Abfrage select * from tblmessage where timestamp desc limit 10 geschrieben.

Es zeigt 30,29,28...21

Aber ich möchte die Sequenz als - 21,22,23...30

20
Gaurav Arora

Ändern Sie den DESC in ASC, und Sie erhalten die gewünschten Datensätze. Wenn Sie sie jedoch geordnet benötigen, müssen Sie die Reihenfolge in der Reihenfolge ändern, in der sie eingehen. Sie können dies entweder in Ihrem eigenen Code tun oder Ihre Abfrage einfach erweitern so:

select * from (select * from tblmessage order by sortfield ASC limit 10) order by sortfield DESC;

Sie sollten immer eine order by-Klausel angeben, nicht nur ASC oder DESC.

33
Michael Dillon

in großen Datenbanken kann die ORDER BY DESC-Anweisung das System wirklich verlangsamen, z. Himbeer-Pi. Ein guter Ansatz, um ORDER BY zu vermeiden, ist der Befehl OFFSET. Und Sie behalten sogar die gespeicherte Bestellung bei:

SELECT * FROM mytable LIMIT 10 OFFSET (SELECT COUNT(*) FROM mytable)-10;

siehe: http://www.sqlite.org/lang_select.html

Überprüfen Sie Ihre Leistung mit:

.timer ON
25
McPeppr

Leicht verbesserte Antwort:

select * from (select * from tblmessage order by sortfield DESC limit 10) order by sortfield ASC;

Michael Dillon hatte die richtige Idee in seine Antwort , aber das Beispiel gibt die ersten paar Reihen in umgekehrter Reihenfolge: 

select * ... (select * ... ASC limit 10) ... DESC

Er wollte das Letzte, es sollte sein: 

select * ... (select * ... DESC limit 10) ... ASC
6
moodboom

Wenn Ihre Tabelle eine Spalte mit Autoincrement des Primärschlüssels enthält (z. B. einige "row_id"), benötigen Sie nur eine Einzelauswahl mit DESC-Reihenfolge in dieser Spalte

Raw Anfrage sieht aus wie 

select * from table_name order by row_id DESC limit 10

Android-Implementierung ist

private Cursor queryLastEvents() {
    return getDatabase().query("table_name", null, null, null, null, null, "row_id DESC", "10");
}
1
voronnenok

Versuche dies,

SQLiteDatabase database = getReadableDatabase();
Cursor c=database.rawQuery("sql Query", null);
if(c.moveToFirst) {
    int curSize=c.getCount()  // return no of rows
    if(curSize>10) {
       int lastTenValue=curSize -10;
       for(int i=0;i<lastTenValue;i++){
          c.moveToNext();
       }
    } else {
       c.moveToFirst();
    }
}

Rufen Sie dann die letzten 10 Daten ab.

1
No_Rulz
select * from
(select * from table_name order by yourfield ASC limit 10)
order by yourfield DESC;

Es gibt keine besseren Lösungen als diese.

0
rs11

In Ihrer Abfrage wird die Variable DESC als Tabellenalias interpretiert.

Wie von ρяσѕρєя K erwähnt, müssen Sie, um eine Sortierrichtung angeben zu können, zuerst mit einer ORDER BY-Klausel sortiert werden.

Die zu sortierende Spalte sollte ein Zeitstempel sein, wenn Sie einen haben, oder eine Spalte mit automatischer Inkrementierung wie der Primärschlüssel der Tabelle.

0
CL.
cursor.moveToLast();
while (cursor.moveToPrevious()){
       //do something
}

mit der gleichen Abfrage: select * aus tblmessage, wobei der Zeitstempel absteigt