2015-03-02 24 views
3

我想在android瀏覽器內容提供商上運行一個簡單的查詢。書籤與歷史項目混合在一起,因此要獲取書籤,只需要選擇「Browser.BookmarkColumns.BOOKMARK = 1」。使用Android內容解析器查詢佔位符整數

String mSelectionClause = Browser.BookmarkColumns.BOOKMARK + " = 1"; 

Cursor cursor = getContentResolver().query(Browser.BOOKMARKS_URI, null, mSelectionClause, null, null); 

工作正常。但是,所有我試圖用一個佔位符來獲得相同的結果失敗:

String mSelectionClause = Browser.BookmarkColumns.BOOKMARK + " = ?"; 

查詢:

Cursor cursor = getContentResolver().query(Browser.BOOKMARKS_URI, null, mSelectionClause, mSelectinArgs, null); 

返回在所有這些情況下,一個空的光標:

mSelectionArgs[0] = "1" 
mSelectionArgs[0] = '1' 
mSelectionArgs[0] = String.valueOf(1) 
mSelectionArgs[0] = Integer.toString(1) 
mSelectionArgs[0] = 1 + "" (idea picked up on this site) 

我做有什麼不對或者我應該放棄使用佔位符的希望?

乾杯。

回答

4

Android數據庫API專爲字符串而非整數設計。有人說這是API設計中的一個錯誤。

無論如何,在你的例子​​你正在使用一個整數(= 1)。這是處理整數的最好和唯一的方法。這樣做也是安全的。如果你使用字符串,你的第二個解決方案將是最安全的。

+0

謝謝。所以經驗法則是「當數據庫字段是字符串時使用佔位符,其他類型直接在選擇子句中使用」? 如果我可以進一步考慮一下,避免硬編碼值的好方法是什麼?條款中是否可以使用提供者定義的常量?還是資源字符串? – 2015-03-03 08:01:58

+0

如果你只是在談論代碼設計,是的,如果你知道Browser.BookmarkColumns.BOOKMARK的值始終爲1,那麼你可以使用一個常量,或者將整行寫成常量(mSelectionClause)。如果在BOOKMARK中有相同條件的查詢,SelectionBuilder類可以幫助您重構代碼並簡化選擇:https://developer.android.com/samples/BasicSyncAdapter/src/com.example。 android.common /分貝/ SelectionBuilder.html – Quanturium 2015-03-03 17:41:49