2012-09-14 82 views
1

我有一個聯繫人表,我只需要獲取特定的ID。查詢ContentProvider的某些ID

想象一下,我有從1到10 IDS 10次的接觸,我希望得到一個Cursor與觸點1和2

的工作準則是:

new CursorLoader(MyContentProvider.CONTACT_CONTENT_URI, null, 
MyContentProvider.CONTACT_COLUMN_ID + " IN  (1, 2)", 
null, null); 

我的問題是我我無法使用selectionArgs參數,因爲轉義會破壞查詢。

你能想到一種使用selectionArgs參數並使其工作的方法嗎?

回答

1

如果你想使用selectionArgs你只能使用它像

String selection = "column IN (?, ?, ?)"; 
String[] selectionArgs = { "1", "2", "3" }; 

你需要建立基於在運行時參數的個數雖然"(?, ?, ?)"字符串。例如。

private static String getSelection(int args) { 
    StringBuilder sb = new StringBuilder(MyContentProvider.CONTACT_COLUMN_ID + " IN ("); 
    boolean first = true; 
    for (int i = 0; i < args; i ++) { 
     if (first) { 
      first = false; 
     } else { 
      sb.append(','); 
     } 
     sb.append('?'); 
    } 
    sb.append(')'); 
    return sb.toString(); 
} 
+0

最好的情況是,這隻適用於由SQLite或其他SQL兼容數據庫支持的'ContentProvider'。現在,在這種情況下,OP大概是查詢OP自己的「ContentProvider」並確保它可以正常工作,但這不是一個安全的技術,您無法控制ContentProvider實現。 – CommonsWare

+0

'ContentProvider'ish的方式是使用'Uri' [查詢參數](http://developer.android.com/reference/android/net/Uri.html#getQueryParameter%28java.lang.String%29)which必須由'ContentProvider'實現。 「ContentProvider」的整個'selection' /'selectionArgs' API太過於以SQL爲中心。 – zapl

+0

@CommonsWare:對我來說沒問題,ContentProvider不會被導出。 – Macarse