2010-01-28 68 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" 
);