在我的应用程序中,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查询可以解决相同的问题,而不是获取数据和填充排序后的东西。
答案 0 :(得分:2)
您必须为LIMIT使用一个排序,并为结果使用另一个排序。所以你需要一个子查询:
SELECT ...
FROM (SELECT ...
...
ORDER BY ID DESC
LIMIT 50)
ORDER BY ID;
为了能够执行此操作,您必须改为使用rawQuery()。
答案 1 :(得分:1)
Node
内部选择查询将选择最后 50条记录,因此排序顺序为 DESC 。 外部选择查询将选择内部选择查询的所有记录,并按升序对其进行排序,因此需要 ASC 。