如何从sqlite android获取特定数量的记录

时间:2017-04-28 11:15:27

标签: android sqlite

在我的应用程序中,sqlite中有许多记录(让我们假设有100条记录)。我想要的是从数据库中获取最后50条记录。我正在使用以下代码来实现此目的。

String [] projection = new String[]{
            ID, MESSAGE_ID, MESSAGE_TYPE, MESSAGE_MEDIA_STATUS, MESSAGE_BODY, MESSAGE_MEDIA_REFERENCE,
            MESSAGE_MEDIA_TYPE, MESSAGE_MEDIA_SIZE, MESSAGE_SENDER_ID, MESSAGE_RECIPIENT_ID,
            MESSAGE_DIRECTION, MESSAGE_STATUS, MESSAGE_LOCAL_STATUS, MESSAGE_TIMESTAMP};
    String selection = MESSAGE_SENDER_ID + "=?" + " AND " + MESSAGE_RECIPIENT_ID + "=?" + " OR " + MESSAGE_SENDER_ID + "=?" + " AND " + MESSAGE_RECIPIENT_ID + "=?";
    String [] selectionArgs = new String[]{String.valueOf(senderId), String.valueOf(recipientId), String.valueOf(recipientId), String.valueOf(senderId)};
    String orderBy = ID + " DESC";
    String limit = "50";
    Cursor cursor = null;
    try {
        cursor = sqLiteDatabase.query(TABLE_MESSAGES, projection, selection, selectionArgs, null, null, orderBy, limit);

        if (cursor.moveToFirst()) {
    //cursor reading stuff
    }

提到的代码按预期正常工作。它获得了最后50条记录,但问题是,它以desc顺序获得最后50条记录。让我们假设我按顺序记录了1到100个数字。我的代码首先更改其顺序(因为查询具有desc子句),这意味着记录将按顺序100到1和"限制50"子句获得前50条记录。现在这是问题所在 现在我的记录将是100,99,98 ,,,最后一条记录将是51但是我希望我的记录按照asc的顺序,因为它最初是在DB中的asc(记录应该被取为51,52,依此类推,直到100) 。我也有一些解决方案。我知道我可以从java比较器中进行排序。我的问题是有没有更好的方法来解决这个问题?或者任何sqlite查询可以解决相同的问题,而不是获取数据和填充排序后的东西。

2 个答案:

答案 0 :(得分:2)

您必须为LIMIT使用一个排序,并为结果使用另一个排序。所以你需要一个子查询:

SELECT ...
FROM (SELECT ...
      ...
      ORDER BY ID DESC
      LIMIT 50)
ORDER BY ID;

为了能够执行此操作,您必须改为使用rawQuery()

答案 1 :(得分:1)

Node

内部选择查询将选择最后 50条记录,因此排序顺序为 DESC 。 外部选择查询将选择内部选择查询的所有记录,并按升序对其进行排序,因此需要 ASC