Android SQLite查询 - 获取最新的10条记录

时间:2012-12-24 07:25:23

标签: android sql sqlite android-sqlite

我的Android应用程序中保存了一个数据库,想要检索插入数据库的最后10条消息。

当我使用时:

Select * from tblmessage DESC limit 10;

它给了我10条消息,但来自 TOP 。但我想要最后 10封邮件。有可能吗?

假设整个表数据是 -

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

我写了查询select * from tblmessage where timestamp desc limit 10

显示30,29,28...21

但我希望序列为 - 21,22,23...30

8 个答案:

答案 0 :(得分:33)

将DESC更改为ASC,您将获得所需的记录,但如果您需要这些记录,则需要撤消它们的顺序。您可以在自己的代码中执行此操作,也可以直接扩展您的查询如下:

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

您确实应该始终指定o​​rder by子句,而不仅仅是ASC或DESC。

答案 1 :(得分:26)

在大型数据库上,ORDER BY DESC语句确实可能会降低系统速度,例如覆盆子pi。避免ORDER BY的一个好方法是OFFSET命令。你甚至保留了存储的订单:

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

请参阅:http://www.sqlite.org/lang_select.html

通过以下方式查看您的表现:

.timer ON

答案 2 :(得分:6)

答案稍有改善:

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

Michael Dillon在his answer中有正确的想法,但该示例给出了前几行,倒序:

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

他想要最后一个,它应该是:

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

答案 3 :(得分:1)

试试这个,

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

然后检索最后10个数据。

答案 4 :(得分:1)

如果您的表包含一个主键自动增量的列(例如某些“row_id”),那么您只需要通过此列按DESC顺序进行单一选择

原始请求看起来像

select * from table_name order by row_id DESC limit 10

Android实施

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

答案 5 :(得分:1)

 "SELECT *  FROM( SELECT *  FROM " + tablename + whereClause + " ORDER BY timestamp DESC LIMIT 10)  ORDER BY timestamp ASC";

答案 6 :(得分:0)

在您的查询中,DESC被解释为表别名。

如ρяσѕρєяK所述,为了能够指定排序方向,您需要首先使用ORDER BY子句进行排序。

要排序的列应该是时间戳(如果有的话)或自动增量列(如表的主键)。

答案 7 :(得分:0)

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

使用相同的查询:从tblmessage中选择*其中timestamp desc limit 10