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

lon*_*ngi 7 android contactscontract android-contacts

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

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

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

他将继续垫子,只会看到'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());
    }
Run Code Online (Sandbox Code Playgroud)

我实际上解决了我的问题

  1. 查询Contacts._ID,Contacts.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);
    
    Run Code Online (Sandbox Code Playgroud)

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

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

lon*_*ngi 0

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

作为记录,这是我的工作示例。它解决了问题,但我仍然认为它会产生很大的过载。在每个用户条目 ( 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;
}
Run Code Online (Sandbox Code Playgroud)