如何使用一个查询搜索带地址的联系人(FORMATTED_ADDRESS)?

时间:2016-08-11 09:31:34

标签: android android-contacts contactscontract

我尝试对用户联系人实施实时搜索,我想获取每个匹配联系人的姓名,缩略图和地址(如果有)。

用户键入时正在运行实时搜索。

所以他输入 ma 并获得'martin','matthews'......

他将继续 mat ,只会看到'matthews'

我尝试使用如下所示的单个查询来实现此目的,但我始终在FORMATTED_ADRESS字段中获取联系号码。我想我遇到JOIN问题,因为我在同一个查询中使用ContactsContract.CommonDataKindsContactsContract.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());
    }

我实际上用

解决了我的问题
  1. 查询Contacts._IDContacts.DISPLAY_NAME
  2. 使用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);
    
  3. 但是这将开始第二次查询每个联系人,这可能不是最好的方法。

    所以我的最后一个问题是:是否可以通过第一个查询来完成这项工作?

1 个答案:

答案 0 :(得分:0)

嗯,非常难过,没有人能够回答我的问题并抓住赏金点; - (

为了记录,这是我的工作示例。它解决了这个问题,但我仍然认为它会产生很大的负荷。在每个用户条目(afterTextchange)上,我调用getContactsDetailsQuery,它首先获取所有用户的ID,其ID包含其名称中的查询(cursor),然后我开始另一个查询({{1}每个用户都可以获得地址。为防止过载,我添加了限制..

detailCursor