2012-09-18 29 views
19

我想通過CursorLoader從sqlite數據庫查詢數據。當我瀏覽Android開發人員網站的文檔時,找不到限制查詢。限制在CursorLoader中的查詢

CursorLoader(Context context, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

我怎樣才能實現CursorLoader限制?

由於提前

回答

28

的hackish的方式:

String sortOrder = "ROWID LIMIT 5" 

這將導致ORDER BY ROWID LIMIT 5ROWID將按照SQLite保留的隱式行id進行排序 - 非常接近當您根本不指定排序oder時發生的情況。 這並不是說濫用訂單參數不檢查提供的值是否僅僅是有效訂單類型的事實。一種緩衝區溢出攻擊。

更好的方法是定義Uri參數。

// query code 
Uri queryUri = Uri.parse("content://what/ever/items"); 
queryUri = queryUri.buildUpon().appendQueryParameter("limit", "5").build(); 

// in ContentProvider 
String limit = queryUri.getQueryParameter("limit"); 

這兩種方法只有在ContentProvider與上述限制嘗試兼容時纔有效。實際上沒有明確的方法來限制或選擇來自ContentProvider的某些數據。每個ContentProvider附帶它自己的合同,因此以上不適用於每個提供商。

1

可以使用SQLiteQueryBuilder方法,其提供有LIMIT條款的能力。 或者您可以將LIMIT附加到您的選擇字符串。
此外,還有一個選項可以通過uri提供限制(作爲其一部分)並在您的ContentProvider中處理它。
看起來像CursorLoader目前沒有提供任何API。

0

我意識到這是遲到了,但sandrstar給了我一個想法,就是用開放的,你傳進的ContentProvider並追加限制爲使用

Uri.withAppendedPath("uri" "/" + limitNumber); 

最後路徑段將其內。然後你內容提供商,在你的URI匹配請確保您在您的查詢匹配

MATCHER.addURI("authority", "uri" + "/#", matchInt); 

然後,檢查你匹配的URI matchInt並獲得最後的路徑段

uri.getLastPathSegment(); 

這將是你的限制,然後使用sandrstar推薦的SQLiteQueryBuilder。

剛剛發現,將自己的參數提供給提供者可能不錯。希望這可以幫助!