如何在android中过滤内容解析器的结果?

时间:2010-01-28 17:03:36

标签: android

我想获取用户联系人,然后附加某种正则表达式并将它们附加到列表视图中。我目前能够通过

获得所有联系人

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

然后将它们传递给扩展SimpleCursorAdapter的自定义类。

所以我想知道如何只获得与正则表达式匹配的联系人而不是所有用户联系人。

4 个答案:

答案 0 :(得分:67)

而不是

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 '

你正在连接字符串。

答案 1 :(得分:6)

您可以使用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语句而不是null。

requestColumns是我想要回来的数据,Contacts.Phones.NUMBER +“='”+ phoneNumber +“'”是Where子句,所以我检索电话号码匹配的名称和类型

答案 2 :(得分:3)

您应该能够将一个合法的SQLite WHERE子句作为query()方法的第三个参数,包括LIKE,但SQLite中没有本机REGEXP函数,Android似乎不允许您定义自己的。因此,根据您的需求的复杂程度,一组其他SQLite条件和LIKE表达式可能会起作用。

请参阅ContentResolver和query methodSQLite expressions上的文档。

答案 3 :(得分: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"
);