Получить все контакты и их данные (например, почтовый адрес) в одном внешнем запросе ОБЪЕДИНЕНИЯ

#android #contacts #contactscontract

#Android #Контакты #contactscontract

Вопрос:

Я знаю, как получить контактные данные для конкретных контактов. Однако я не могу найти способ получить все контакты плюс некоторые их данные в одном запросе. Следующий код возвращает все контакты, имеющие почтовый адрес:

   Uri uri = ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI;
  String[] projection = new String[] {
    StructuredPostal._ID,
    StructuredPostal.LOOKUP_KEY,
    StructuredPostal.DISPLAY_NAME,
    StructuredPostal.STREET,
    StructuredPostal.CITY
  };
  String sortOrder = StructuredPostal.DISPLAY_NAME   " COLLATE LOCALIZED ASC";
  Cursor c = getContentResolver().query(uri, projection, null, null, sortOrder);
  

Но мне нужны все контакты, независимо от того, есть у них почтовый адрес или нет. Это выполнимо с помощью ContatsContract API или мне нужно создать пользовательский запрос внешнего соединения? Есть какие-либо подсказки о том, как это сделать?

Ответ №1:

если у вас есть идентификатор контакта и вы хотите получить почтовый адрес, используйте это :

          Uri postal_uri = ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI;
         Cursor postal_cursor  = getContentResolver().query(postal_uri,null,  ContactsContract.Data.CONTACT_ID   "=" contactId.toString(), null,null);
          while(postal_cursor.moveToNext())
            {
             String Strt = postal_cursor.getString(postal_cursor.getColumnIndex(StructuredPostal.STREET));
             String Cty = postal_cursor.getString(postal_cursor.getColumnIndex(StructuredPostal.CITY));
             String cntry = postal_cursor.getString(postal_cursor.getColumnIndex(StructuredPostal.COUNTRY));
            } 
            postal_cursor.close();                   
  

Ответ №2:

Вся контактная информация в Android 2.0 хранится в одной таблице базы данных. Таким образом, вы можете получить всю необходимую информацию в одном запросе:

 Cursor c = getContentResolver().query(ContactsContract.Data.CONTENT_URI,
    null, null, null, sortOrder);
  

Просто выполните итерацию по столбцу данных и проверьте Data.MIMETYPE . Например, если в этом столбце есть StructuredPostal.CONTENT_ITEM_TYPE значение, то вы можете получить StructuredPostal поля из этого столбца.

Комментарии:

1. Действительно, но это требует последующей обработки. Я надеялся получить правильный курсор результата прямо из запроса, чтобы я мог передать его непосредственно в адаптер просмотра списка. Но это тоже подойдет, спасибо за идею!

2. Я думаю, что это старое и больше не действует? Похоже, что теперь номер телефона хранится в другом URI.