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
Run Code Online (Sandbox Code Playgroud)LIMIT 20,2我认为它应该跳过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是你的从零开始的页码.
| 归档时间: |
|
| 查看次数: |
5354 次 |
| 最近记录: |