Контакты Android Отображаемое имя и номер телефона (ы) в запросе одной базы данных?

Я пытаюсь получить список контактов из собственной базы данных с их отображаемым именем и номером телефона (все или все). Существует много способов получения этой информации с несколькими запросами в базе данных телефона, но это создает значительные накладные расходы.

Вот запрос, над которым я работал, но это приводит к

Uri uri = ContactsContract.Contacts.CONTENT_URI; String[] projection = new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER}; String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = '1'"; String[] selectionArgs = null; String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; Cursor people = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder); int index_id = people.getColumnIndex(ContactsContract.Contacts._ID); int indexName = people.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); int indexNumber = people.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); people.moveToFirst(); do { String _id = people.getString(index_id); String name = people.getString(indexName); String number = people.getString(indexNumber); // Do work... } while (people.moveToNext()); 

И вот итоговая ошибка.

 E/AndroidRuntime(21549): Caused by: java.lang.IllegalArgumentException: Invalid column data1 E/AndroidRuntime(21549): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:144) E/AndroidRuntime(21549): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114) E/AndroidRuntime(21549): at android.content.ContentProviderProxy.bulkQueryInternal(ContentProviderNative.java:372) E/AndroidRuntime(21549): at android.content.ContentProviderProxy.query(ContentProviderNative.java:408) E/AndroidRuntime(21549): at android.content.ContentResolver.query(ContentResolver.java:264) 

Мысли? Я считаю, что объединение может понадобиться, чтобы получить все столбцы в одном запросе.

    Попробуйте этот код:

     Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; String[] projection = new String[] {ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER}; Cursor people = getContentResolver().query(uri, projection, null, null, null); int indexName = people.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME); int indexNumber = people.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); if(people.moveToFirst()) { do { String name = people.getString(indexName); String number = people.getString(indexNumber); // Do work... } while (people.moveToNext()); } 

    API контактов чрезвычайно сложный и имеет несколько неявных объединений .

    Прочтите ContactContract и ContactsProvider2, если вы можете позволить себе время.

    Что ты хочешь? Таблицы соединены цепочкой следующим образом:

    • Контакт 1 – * Raw Contact
    • Raw Contact 1 – * Номер телефона (data.table)

    API работает так: вы выбираете самый нижний элемент (телефонный номер) и неявное соединение с самым верхним элементом (контакт).

    Вы хотите использовать ТЕЛЕФОН URI (ContactsProvider2 / line 4377). Это должно выбрать все номера телефонов и присоединиться к контакту.

    Объедините PHONE uri с маской UI (для группировки), запросите DISPLAY_NAME и номер PHONE (DATA1?), И вы сможете решить проблему.

    Телефонные номера хранятся в их собственной таблице, и их необходимо запрашивать отдельно. Чтобы запросить таблицу телефонных номеров, используйте URI, хранящийся в переменной SDK ContactsContract.CommonDataKinds.Phone.CONTENT_URI. Используйте WHERE, чтобы получить номера телефонов для указанного контакта.

     private String displayName(Uri contactUri) { HashSet detail = ContactDetail.getInstance().getContactArray(); Log.d("ITEM", contactUri.toString()); String[] projection = new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER}; Cursor queryCursor = getActivity().getContentResolver() .query(contactUri, null, null, null, null); queryCursor.moveToFirst(); String name = queryCursor.getString(queryCursor.getColumnIndex("display_name")); String id = queryCursor.getString( queryCursor.getColumnIndex(ContactsContract.Contacts._ID)); if (Integer.parseInt(queryCursor.getString(queryCursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { Cursor pCur = getActivity().getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{id}, null); while (pCur.moveToNext()) { String number = pCur.getString(pCur.getColumnIndex("data1")); Log.d("Contact Name: ", number); } pCur.close(); } return name; } 

    Выполните второй запрос к базе данных SQLite для контактов Android. Номера телефонов запрашиваются против URI, хранящихся в ContactsContract.CommonDataKinds.Phone.CONTENT_URI. Идентификатор контакта сохраняется в телефонной таблице как ContactsContract.CommonDataKinds.Phone.CONTACT_ID, а предложение WHERE используется для ограничения возвращаемых данных.

    Interesting Posts

    Проблемы с передачей свойств и параметров системы при запуске Java-classа через Gradle

    Как заставить SSL / https в Express.js

    Как отключить функцию Windows 7, которая максимизирует окно на весь экран при перемещении к краю экрана (но не работает ли быстрые клавиши)?

    Установка SSL на сервере Wamp: ошибка в httpd-ssl.conf

    Обнаружение мобильных устройств в asp.net

    Android: наложение на просмотр камеры Android

    Может ли «это» когда-либо быть пустым в Java?

    Вентилятор не замедлит мой Dell Optiplex 760

    Как я могу сделать свой экран пустым с помощью ярлыка?

    Как я могу получить список стека вызовов в Perl?

    Как синхронизировать папки искателя в их соответствующие альбомы в iPhoto?

    Есть ли программа, которая позволяет мне отправлять аудиовыход на микрофонный вход (реальный или виртуальный микрофон)?

    Windows 7 не запускается в любом режиме. Что делать?

    Отключить VPN для данного процесса / приложения

    порядок и положение операторов перенаправления cmd.exe

    Давайте будем гением компьютера.