偏移量和限制的 SQLite 分页问题
SQLite Paging issue with Offset and Limit
我正在进行如下查询以在一页中加载 10 个引号
arrayList.addAll(db.loadFav(CURRENT_PAGE, Constant.ITEM_PER_PAGE));
和DBHelper.loadFav
如下所示
public ArrayList<ItemQuotes> loadFav(int offset, int limit) {
ArrayList<ItemQuotes> arrayList = new ArrayList<>();
try {
//Cursor cursor = db.query(TABLE_QUOTES_FAV, columns_quotes, null, null, null, null, null);
String query = "SELECT * FROM " + TABLE_QUOTES_FAV + " ORDER BY " + TAG_QUOTES_ID + " ASC "+ " LIMIT " + offset+","+limit;
Cursor cursor = db.rawQuery(query, null);
if (cursor != null && cursor.moveToFirst()) {
Log.e("ABC", cursor.getCount() + "");
for (int i = 0; i < cursor.getCount(); i++) {
String qid = cursor.getString(cursor.getColumnIndex(TAG_QUOTES_ID));
String quotes = cursor.getString(cursor.getColumnIndex(TAG_QUOTES));
String cid = cursor.getString(cursor.getColumnIndex(TAG_CAT_ID));
String cname = cursor.getString(cursor.getColumnIndex(TAG_CAT_NAME));
String quote_time = cursor.getString(cursor.getColumnIndex(TAG_QUOTE_TIME));
ItemQuotes itemQuotes = new ItemQuotes(qid, quotes, cid, cname, quote_time);
arrayList.add(itemQuotes);
cursor.moveToNext();
}
cursor.close();
}
} catch (Exception e) {
e.printStackTrace();
}
return arrayList;
}
在第一次通话中 When CURRENT_PAGE=1, its loading 10 Quotes, WHEN CURRENT_PAGE= 2, its loading 9 Quotes and so on for next
...但是我在 Table 中只有 11 个报价...我不知道这有什么问题以及如何解决它。让我知道这里是否有人可以帮助我解决问题。谢谢!
String query = "SELECT * FROM " + TABLE_QUOTES_FAV + " ORDER BY " + TAG_QUOTES_ID + " ASC "+ " LIMIT " + limit + " OFFSET "+ offset;
查询样本
SELECT * FROM
TABLE_QUOTES_FAV LIMIT 10 OFFSET 20
当CURRENT_PAGE=1
你想要OFFSET
是0
,当CURRENT_PAGE=2
你想要OFFSET
是10
等等。
您正在做的是将 CURRENT_PAGE
传递给 loadFav()
的参数 offset
,因此您将 CURRENT_PAGE
用作 offset
.
您应该将 offset
计算为:
(CURRENT_PAGE - 1) * Constant.ITEM_PER_PAGE
因此,将您的 sql 语句更改为:
String query =
"SELECT * FROM " + TABLE_QUOTES_FAV + " ORDER BY " + TAG_QUOTES_ID + " ASC " +
"LIMIT " + ((offset - 1) * limit) + "," + limit;
但正确的做法是将 loadFav()
的第一个参数的名称从 offset
更改为 currentPage
:
loadFav(int currentPage, int limit)
以便清楚该参数代表什么并使用变量:
int offset = (currentPage - 1) * limit;
然后您可以在代码中使用您的 sql 语句。
我正在进行如下查询以在一页中加载 10 个引号
arrayList.addAll(db.loadFav(CURRENT_PAGE, Constant.ITEM_PER_PAGE));
和DBHelper.loadFav
如下所示
public ArrayList<ItemQuotes> loadFav(int offset, int limit) {
ArrayList<ItemQuotes> arrayList = new ArrayList<>();
try {
//Cursor cursor = db.query(TABLE_QUOTES_FAV, columns_quotes, null, null, null, null, null);
String query = "SELECT * FROM " + TABLE_QUOTES_FAV + " ORDER BY " + TAG_QUOTES_ID + " ASC "+ " LIMIT " + offset+","+limit;
Cursor cursor = db.rawQuery(query, null);
if (cursor != null && cursor.moveToFirst()) {
Log.e("ABC", cursor.getCount() + "");
for (int i = 0; i < cursor.getCount(); i++) {
String qid = cursor.getString(cursor.getColumnIndex(TAG_QUOTES_ID));
String quotes = cursor.getString(cursor.getColumnIndex(TAG_QUOTES));
String cid = cursor.getString(cursor.getColumnIndex(TAG_CAT_ID));
String cname = cursor.getString(cursor.getColumnIndex(TAG_CAT_NAME));
String quote_time = cursor.getString(cursor.getColumnIndex(TAG_QUOTE_TIME));
ItemQuotes itemQuotes = new ItemQuotes(qid, quotes, cid, cname, quote_time);
arrayList.add(itemQuotes);
cursor.moveToNext();
}
cursor.close();
}
} catch (Exception e) {
e.printStackTrace();
}
return arrayList;
}
在第一次通话中 When CURRENT_PAGE=1, its loading 10 Quotes, WHEN CURRENT_PAGE= 2, its loading 9 Quotes and so on for next
...但是我在 Table 中只有 11 个报价...我不知道这有什么问题以及如何解决它。让我知道这里是否有人可以帮助我解决问题。谢谢!
String query = "SELECT * FROM " + TABLE_QUOTES_FAV + " ORDER BY " + TAG_QUOTES_ID + " ASC "+ " LIMIT " + limit + " OFFSET "+ offset;
查询样本
SELECT * FROM
TABLE_QUOTES_FAV LIMIT 10 OFFSET 20
当CURRENT_PAGE=1
你想要OFFSET
是0
,当CURRENT_PAGE=2
你想要OFFSET
是10
等等。
您正在做的是将 CURRENT_PAGE
传递给 loadFav()
的参数 offset
,因此您将 CURRENT_PAGE
用作 offset
.
您应该将 offset
计算为:
(CURRENT_PAGE - 1) * Constant.ITEM_PER_PAGE
因此,将您的 sql 语句更改为:
String query =
"SELECT * FROM " + TABLE_QUOTES_FAV + " ORDER BY " + TAG_QUOTES_ID + " ASC " +
"LIMIT " + ((offset - 1) * limit) + "," + limit;
但正确的做法是将 loadFav()
的第一个参数的名称从 offset
更改为 currentPage
:
loadFav(int currentPage, int limit)
以便清楚该参数代表什么并使用变量:
int offset = (currentPage - 1) * limit;
然后您可以在代码中使用您的 sql 语句。