我尝试对用户联系人实施实时搜索,我想获取每个匹配联系人的姓名,缩略图和地址(如果有)。
用户键入时正在运行实时搜索。
所以他输入 ma 并获得'martin','matthews'......
他将继续 mat ,只会看到'matthews'
我尝试使用如下所示的单个查询来实现此目的,但我始终在FORMATTED_ADRESS
字段中获取联系号码。我想我遇到JOIN
问题,因为我在同一个查询中使用ContactsContract.CommonDataKinds
和ContactsContract.Contacts
?
public static List<ContactModel> getContactsForQuery(Context context, String query) {
String[] projection = new String[] {
ContactsContract.Contacts.DISPLAY_NAME,
Contacts.PHOTO_THUMBNAIL_URI,
ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS
};
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
String selection = ContactsContract.Contacts.DISPLAY_NAME + " LIKE '%" + query + "%'";
Cursor cursor = context.getContentResolver().query(uri, projection, selection, null,null);
if (cursor.moveToFirst()) {
do {
String name = cursor.getString(0);
String thumbail = cursor.getString(1);
String formattedADress = cursor.getString(2);
}
while (cursor.moveToNext());
}
我实际上用
解决了我的问题Contacts._ID
,Contacts.DISPLAY_NAME
使用Contacts._ID
开始第二个查询,如下所示
Cursor detailCursor = context.getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
new String[]{
CommonDataKinds.StructuredPostal.STREET,
CommonDataKinds.StructuredPostal.CITY,
CommonDataKinds.StructuredPostal.POSTCODE
},
ContactsContract.Data.CONTACT_ID + "=? AND "
+ CommonDataKinds.StructuredPostal.MIMETYPE + "=?",
new String[]{
String.valueOf(contactID),
CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE
},
null);
但是这将开始第二次查询每个联系人,这可能不是最好的方法。
所以我的最后一个问题是:是否可以通过第一个查询来完成这项工作?
答案 0 :(得分:0)
为了记录,这是我的工作示例。它解决了这个问题,但我仍然认为它会产生很大的负荷。在每个用户条目(afterTextchange
)上,我调用getContactsDetailsQuery
,它首先获取所有用户的ID,其ID包含其名称中的查询(cursor
),然后我开始另一个查询({{1}每个用户都可以获得地址。为防止过载,我添加了限制..
detailCursor