2015-05-26 82 views
1

我用下面的代碼獲取通知名單(共行21個)的Android SQLite的查詢與偏移不返回所需的行

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(); 
} 

和偏移生成的查詢= 0是

SELECT Id, Token, Title, Read, Message, Image, CreateDate, CreateDateFA FROM Notifications ORDER BY CreateDate DESC LIMIT 20,0 

和它的作品,因爲它是應該和返回20行,當我增加補償1(偏移= 1),它僅返回1行是正確的,但問題是當偏移量比較大1,那麼查詢將是

SELECT Id, Token, Title, Read, Message, Image, CreateDate, CreateDateFA FROM Notifications ORDER BY CreateDate DESC LIMIT 20,2 

我認爲它應該跳過20 * 2行,然後開始從那裏取出行,這或者是我的想法或我的查詢是錯誤的。我在這裏做錯了什麼?由於

+0

我不明白你想要什麼,但可以在這裏找到答案可能:http://sqlite.org/lang_select.html#limitoffset –

+0

下面是你的一個明確的解釋:http://stackoverflow.com/questions/3325515/sqlite-limit-offset-query – trevor

回答

9
LIMIT 20,2 

,我想這應該跳過20個* 2行,然後開始從那裏走行,這無論是我的思想或我的查詢是錯誤的。

LIMIT 20,2跳過前20行並返回至多2個剩餘行。這與LIMIT 2 OFFSET 20相同。

即使documentation說,這是反直覺:

而是一個獨立的OFFSET子句,LIMIT子句可以指定用逗號分隔的兩個標量的表達式。在這種情況下,第一個表達式用作OFFSET表達式,第二個表達式用作LIMIT表達式。這是違反直覺的,因爲當使用OFFSET子句時,兩個表達式中的第二個是OFFSET和第一個LIMIT。這種偏移和極限的反轉是有意的 - 它最大限度地提高了與其他SQL數據庫系統的兼容性。但是,爲避免混淆,強烈建議程序員使用使用「OFFSET」關鍵字的LIMIT子句的形式,並避免使用帶逗號分隔的偏移量的LIMIT子句。

如果你想達到某種與20的頁面大小結果分頁的,使用類似OFFSET k*20 LIMIT 20其中k是你從零開始的頁碼。

+0

是的,我意識到,再次閱讀它。非常感謝,我現在就試試 –

1

可以內Cursor使用偏移爲「偏移限制」值:

Cursor cursor = db.query(
      TABLE_NAME, 
      new String[]{COLUMN_NAME_1, COLUMN_NAME_2, COLUMN_NAME_3}, 
      null, 
      null, 
      null, 
      null, 
      null, 
      "6,1000"); 

在這個例子中,我選擇了所有行(我想不超過1000)從7 1開始。這裏6是你的抵消和1000的限制。

1

這裏需要了解LIMIT <offset>, <count> & LIMIT <count> OFFSET <offset>是等價的。

一個例子:

A)我們有id列的4記錄一個表,值是1 | 2 | 3 | 4分別爲4行。

B)如果執行select * from TABLE_NAME:它返回表中的所有記錄,按順序1 | 2 | 3 | 4。

C)如果我們需要總(例如限制)1分的記錄,它應該從開始偏移指數2,然後用

select * from TABLE_NAME limit 1 offset 2

這將返回記錄索引。| 3 | as request limit = 1 & offset index = 2.

相同可以使用select * from company limit 2, 1;類似於@laalto提到的。

注意,這裏是2偏移量& 1是限制(反向)。

由於Android SDK不提供單獨的屬性來設置偏移量,在這種情況下,SQLiteDatabase.query(...,limit)的最後'limit'屬性可用作limit 2, 1