2010-01-28 67 views
31

我想獲取用戶聯繫人,然後附加某種正則表達式並將它們附加到列表視圖中。我目前能夠通過如何在android中過濾內容解析器的結果?

getContentResolver().query(People.CONTENT_URI, null, null, null, null);

讓所有的聯繫人,然後將它們傳遞到擴展SimpleCursorAdapter自定義類。

所以我想知道如何獲得匹配正則表達式的聯繫人,而不是所有的用戶聯繫人。

回答

63

而不是

getContentResolver().query(People.CONTENT_URI, null, null, null, null); 

你應該使用類似

final ContentResolver resolver = getContentResolver(); 
final String[] projection = { People._ID, People.NAME, People.NUMBER }; 
final String sa1 = "%A%"; // contains an "A" 
cursor = resolver.query(People.CONTENT_URI, projection, People.NAME + " LIKE ?", 
    new String[] { sa1 }, null); 

此使用參數請求(使用),並提供實際的值不同的參數,這樣就避免了級聯和主要是在您向用戶請求過濾時主要阻止SQL注入。例如,如果你正在使用

cursor = resolver.query(People.CONTENT_URI, projection, 
    People.NAME + " = '" + name + "'", 
    new String[] { sa1 }, null); 

想象一下,如果

name = "Donald Duck' OR name = 'Mickey Mouse") // notice the " and ' 

,你是串聯字符串。

+0

非常感謝您的回覆我真的很感激。 – maxsap 2010-01-30 00:01:39

+2

非常好的解釋,非常感謝! – 2012-04-19 13:20:10

5

您可以使用sql類型輸入查詢內容提供者,Query方法只是sql命令的包裝器。

這裏就是我查詢聯繫人的名字賦予了特定數量

String [] requestedColumns = { 
      Contacts.Phones.NAME, 
      Contacts.Phones.TYPE 
    }; 

Cursor contacts = context.getContentResolver().query(
      Contacts.Phones.CONTENT_URI, 
      requestedColumns, 
      Contacts.Phones.NUMBER + "='" + phoneNumber + "'", 
      null, null); 

注意,而不是空我有一個建立在SQL語句的參數的例子。

的requestColumns是數據我想回去和Contacts.Phones.NUMBER +「=「」 + phoneNumber的+「」」是Where子句,讓我找回在電話號碼匹配

的名稱和類型
3

您應該可以將合法的SQLite WHERE子句作爲query()方法的第三個參數,包括LIKE,但SQLite中沒有本機REGEXP函數,而Android似乎不允許您定義自己的。因此,根據您的需求的複雜程度,一組其他SQLite條件和LIKE表達式可能會有所裨益。

請參閱ContentResolver和SQLite expressionsquery method的文檔。

1

實際上,使用Calllog Content Provider的REGEXP工作(意味着爲該內容提供者的數據庫https://sqlite.org/lang_expr.html#regexp定義了regexp()函數)!但速度非常緩慢:約1750記錄約15秒。

String regexp = "([\\s\\S]{0,}" + 
TextUtils.join("||[\\s\\S]{0,}", numbers) + 
")"; 

cursor = context.getContentResolver().query(
CallLog.Calls.CONTENT_URI, 
null, 
CallLog.Calls.NUMBER + " REGEXP ?", 
new String[]{regexp}, 
CallLog.Calls.DATE + " DESC" 
);