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

max*_*sap 33 android

我想获得用户联系人,然后附加某种正则表达式并将它们附加到列表视图.我目前能够获得所有联系人

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

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

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

Die*_*ano 68

代替

getContentResolver().query(People.CONTENT_URI, null, null, null, null); 
Run Code Online (Sandbox Code Playgroud)

你应该使用类似的东西

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);
Run Code Online (Sandbox Code Playgroud)

这使用参数化的请求(使用)并将实际值作为不同的参数提供,这避免了连接并主要阻止SQL注入,如果您从用户请求过滤器.例如,如果您正在使用

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

想象一下

name =  "Donald Duck' OR name = 'Mickey Mouse") // notice the " and '
Run Code Online (Sandbox Code Playgroud)

而你正在连接字符串.


Don*_*rty 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);
Run Code Online (Sandbox Code Playgroud)

请注意,我有一些参数来构建sql语句,而不是null.

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