带偏移的android sqlite查询不返回所需的行

ara*_*een 5 java sqlite android android-sqlite

我正在使用以下代码获取通知列表(总行数为21):

List<Notification> list = new ArrayList<Notification>();
Cursor c = _db.query(TABLE_NAME, COL_ALL, null, null, null, null, order, get_limitStr(offset));
if(c != null && c.moveToFirst())
{
    while(!c.isAfterLast())
    {
        Notification model = cursorToModel(c);
        if(model != null)
        {
            list.add(model);
        }
        c.moveToNext();
    }
    c.close();
}
Run Code Online (Sandbox Code Playgroud)

并且生成的offset = 0的查询是

SELECT Id, Token, Title, Read, Message, Image, CreateDate, CreateDateFA FROM Notifications ORDER BY CreateDate DESC LIMIT 20,0
Run Code Online (Sandbox Code Playgroud)

并且它按预期工作并返回20行,当我将偏移量增加1(偏移= 1)时,它只返回1行,这是正确的,但问题是当偏移量大于1时,查询将是

SELECT Id, Token, Title, Read, Message, Image, CreateDate, CreateDateFA FROM Notifications ORDER BY CreateDate DESC LIMIT 20,2
Run Code Online (Sandbox Code Playgroud)

我认为它应该跳过20*2行,然后开始从那里开始行,这是我的想法或我的查询是错误的.我在这做错了什么?谢谢

laa*_*lto 15

LIMIT 20,2
Run Code Online (Sandbox Code Playgroud)

我认为它应该跳过20*2行,然后开始从那里开始行,这是我的想法或我的查询是错误的.

LIMIT 20,2跳过前20行并返回最多2个剩余行.它是一样的LIMIT 2 OFFSET 20.

甚至文档都说这是违反直觉的:

LIMIT子句可以指定由逗号分隔的两个标量表达式,而不是单独的OFFSET子句.在这种情况下,第一个表达式用作OFFSET表达式,第二个表达式用作LIMIT表达式.这是违反直觉的,因为当使用OFFSET子句时,两个表达式中的第二个是OFFSET,第一个是LIMIT.这种偏移和限制的逆转是有意的 - 它最大化了与其他SQL数据库系统的兼容性.但是,为了避免混淆,强烈建议程序员使用LIMIT子句的形式使用"OFFSET"关键字,并避免使用带逗号分隔偏移量的LIMIT子句.

如果你想达到某种与20的页面大小结果分页的,使用像OFFSET k*20 LIMIT 20这里k是你的从零开始的页码.