【问题标题】:SQLite Paging issue with Offset and Limit偏移和限制的 SQLite 分页问题
【发布时间】:2020-11-07 04:58:44
【问题描述】:

我正在进行如下查询以在一页中加载 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...但是我的表中只有 11 个报价...我不知道这有什么问题以及如何解决它。让我知道是否有人可以在这里帮助我摆脱问题。谢谢!

【问题讨论】:

    标签: java android sqlite android-sqlite


    【解决方案1】:

    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语句了。

    【讨论】:

      【解决方案2】:
      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-21
        • 2017-04-14
        • 2022-11-03
        • 2016-03-16
        • 1970-01-01
        • 2014-09-20
        • 2014-08-26
        • 1970-01-01
        相关资源
        最近更新 更多