Sqlite андроидный экстракт контакты с номером телефона

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

Cursor cursor = context.getContentResolver(). query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[]{ ContactsContract.CommonDataKinds.Phone.CONTACT_ID, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.PHOTO_URI }, ContactsContract.Contacts.HAS_PHONE_NUMBER + ">?", new String [] {"0"}, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC" ); 

Проблема в том, что в случае, если контакт имеет более одного номера телефона, результат будет в таком виде:

 id: 451, name: Maria, photoUri: null, has_phone_number: 1, phone_number: 0700 000 000 id: 451, name: Maria, photoUri: null, has_phone_number: 1, phone_number: 0800 000 000 id: 451, name: Maria, photoUri: null, has_phone_number: 1, phone_number: 0900 000 000 

Что нежелательно из-за дублирования данных.

Я хочу сделать только 1 запрос к db, который, надеюсь, можно записать, чтобы вернуть результат следующим образом:

 id: 451, name: Maria, photoUri: null, has_phone_number: 1, phone_number: 0700 000 000, 0800 000 000, 0900 000 000 

Является ли это возможным?

Спасибо.

Я не думаю, что возможно, что вы хотите сделать, Это обходное решение с использованием HashMap. Он может обрабатывать тысячи записей, поэтому не беспокойтесь.

  Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[]{ ContactsContract.CommonDataKinds.Phone.CONTACT_ID, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.PHOTO_URI }, ContactsContract.Contacts.HAS_PHONE_NUMBER + ">?", new String [] {"0"}, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"); Map<String, List<String>> phonesPerContact = new HashMap<>(); if (cursor.moveToFirst()) { do { String name = cursor.getString(2); String phone = cursor.getString(1); if (!phonesPerContact.containsKey(name)){ phonesPerContact.put(name, new ArrayList<String>()); } phonesPerContact.get(name).add(phone); } while (cursor.moveToNext()); } for (String name: phonesPerContact.keySet()){ //Do whatever you want with the contact and its list of phones List<String> phones = phonesPerContact.get(name); Log.i("test", "Name: " + name + ", Numbers: " + phones.toString()); } 
Intereting Posts
Как реализовать несколько версий Android для использования разных библиотек? Андроид поп-фрагмента из backstack с анимацией Android: выбор между двумя языками без "locale" Гибридное приложение Visual Studio 2015 – получение «EPERM, операция не разрешена» Могу ли я получать сообщения GCM из двух или более GCM SENDER_ID в моем приложении? Портирование на Android: почему я получаю «Невозможно создать XMLReader по умолчанию; Это системное свойство org.xml.sax.driver set? "? Как избежать httpsURLConnection.getInputStream () в Android, зависающем, если указаны неверные учетные данные? Как почтить и распаковать файлы? ActionBar.setNavigationMode (ActionBar.NAVIGATION_MODE_TABS) устарело Могу ли я принудительно расширять уведомление об андроиде на Android 4.1+? Не удалось создать проект Xamarin.Android с помощью «Ошибка XA5209: Сбой при распаковке» Размеры виртуальной клавиатуры QML Android – Наследование и абстрактные классы в GSon + RetroFit IntelliJ Android Runtime Exception: ClassNotFound, не нашел класс по пути Котлин – эквивалентность комбинации Свифта «если пусть + литье»