【问题标题】:How to search Contacts with address (FORMATTED_ADDRESS) with one query?如何通过一次查询搜索具有地址(FORMATTED_ADDRESS)的联系人?
【发布时间】:2016-12-17 23:07:05
【问题描述】:

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

实时搜索在用户输入时运行。

所以他输入 ma​​ 会得到 'martin'、'matthews'...

他会继续使用 ma​​t,并且只会看到“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);
    

但这会为每个联系人启动第二次查询,这可能不是最好的方法。

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

【问题讨论】:

  • 为什么要投反对票?我错过了什么吗?

标签: android android-contacts contactscontract


【解决方案1】:

嗯,很伤心,没有人能回答我的问题并抢到赏金;-(

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

public static List<SearchModel> getContactDetailsForQuery(Context context, String query, int limit) {

    final int CONTACT_ID_INDEX = 0;
    final int CONTACT_NAME_INDEX = 1;
    final int CONTACT_THUMBNAIL_INDEX = 2;

    //my custom model to hold my results
    List<SearchModel> results = new ArrayList<SearchModel>();

    final String[] selectUser = new String[]{
        Contacts._ID,
        Contacts.DISPLAY_NAME,
        Contacts.PHOTO_THUMBNAIL_URI};
    String selection = Contacts.DISPLAY_NAME + " LIKE ?";
    String[] selectionArgs = new String[]{"%" + query + "%"};
    String sortOrder = Contacts.DISPLAY_NAME + " ASC";

    Cursor cursor = context.getContentResolver().query(Contacts.CONTENT_URI, selectUser, selection, selectionArgs, sortOrder, null);

    int contactCounter = 0;
    if (cursor != null && cursor.moveToFirst()) {

        do {
            String contactID = cursor.getString(CONTACT_ID_INDEX);
            String displayName = cursor.getString(CONTACT_NAME_INDEX);
            String thumbnail = cursor.getString(CONTACT_THUMBNAIL_INDEX);

            //get user details with user id (this is the query i wanted to change in my question!!)
            Cursor detailCursor = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI,
                new String[]{
                    CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS},
                ContactsContract.Data.CONTACT_ID + "=? AND " +
                    CommonDataKinds.StructuredPostal.MIMETYPE + "=?",
                new String[]{String.valueOf(contactID), CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE},
                null);

            if (detailCursor != null && detailCursor.moveToFirst()) {
                //special case: user has several address, query all of them
                do {
                    String formattedAddress = detailCursor.getString(detailCursor.getColumnIndex(CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS));
                    //user has serveral adress -> init model for each adress
                    SearchModel contact = new SearchModel();
                    results.add(contact);
                    contactCounter++;

                } while (detailCursor.moveToNext() && contactCounter < limit);

            } else {

                //user has no adress -> init model
                SearchModel contact = new SearchModel();
                results.add(contact);
                contactCounter++;
            }

            detailCursor.close();

        } while (cursor.moveToNext() && contactCounter < limit);
    }
    cursor.close();

    return results;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多