Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Max_92
25 / 7 / 2
Регистрация: 26.04.2010
Сообщений: 205
#1

Как в одном query обращаться к столбцам, принадлежащим к разным контент-провайдерам? - Android

15.03.2014, 13:47. Просмотров 584. Ответов 0
Метки нет (Все метки)

Нужно в ОДНОМ query получить cursor, в который будут включены все имеющиеся контакты, со столбцами Contacts._ID, Contacts.DISPLAY_NAME, CommonDataKinds.Email.ADDRESS, CommonDataKinds.Photo.PHOTO_URI. (заказчик не разрешает использовать несколько курсоров и формировать нормальный ArrayList). Т.е. два последние столбца относятся к другим таблицам и если их включать в projection происходит крэш на вызове getContentResolver().query.
Эти данные можно получить также, если использовать CONTENT_URI, находящийся в таблице Data. Но весь гемор в том, что в этой таблице столбец "DATA1" для одних записей хранит номер телефона, для других - email, в зависимости от значения столбца MIMETYPE. 2 таких записи могут относиться к контакту с одним и тем же "DISPLAY_NAME". Т.е., если использовать запрос:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        String[] projection = new String[] { Data._ID, Data.DISPLAY_NAME,
                Data.DATA1, Data.PHOTO_URI };
 
        String selection = "(" + Data.HAS_PHONE_NUMBER + "=1 AND ("
                + Data.MIMETYPE + "=? OR " + Data.MIMETYPE + "=?)) OR " + "("
                + Data.HAS_PHONE_NUMBER + "=0 AND (" + Data.MIMETYPE + "=?))";
 
        Log.d(LOG_TAG, "MainActivity : " + selection);
 
        return getContentResolver().query(
                Data.CONTEN_URI,
                projection,
                selection,
                new String[] { Email.CONTENT_ITEM_TYPE,
                        Phone.CONTENT_ITEM_TYPE, Email.CONTENT_ITEM_TYPE },
                Data.DISPLAY_NAME);
то в случае если у контакта есть и email и телефон, в курсоре будут ДВЕ таких записи с одинаковыми именами (если проверять наличие у него чего-то одного, то допустим, все контакты у которых email'ов нет в набор НЕ попадут).

Поэтому единственно правильным решением является получение курсора по записям из таблицы Contacts (т.е. использовать Contacts.CONTENT_URI), в которой нет записей с одинаковыми именами (т.к. это готовые контакты, которые агрегируют в себе один или несколько RawContacts). Но как при этом в этом же query получать значения из столбцов CommonDataKinds.Email.ADDRESS, CommonDataKinds.Photo.PHOTO_URI, относящихся к контакту с текущим "_ID" из Contacts ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2014, 13:47     Как в одном query обращаться к столбцам, принадлежащим к разным контент-провайдерам?
Посмотрите здесь:

Как сохранить настройки в одном Activity и получить в другом? Android
Android Как разнести исходной код по разным файлам
Android Android query и HTTP Post
Android Как делать перелистываемые страницы с разным содержанием, используя ViewPager и PageAdapter?
Фильтрация записей в db.query(.) Android
Android Как обращаться к кнопке из массива методом switch?
Android Сбросил пароли БД после предложение перестало обращаться
Android Как разместить EditText и область рисования Canvas в одном Activity?
Android SelectionArgs в query
Android Query, правильно ли составлен запрос?
Множество условий selection в query Android
Android Как расположить на одном уровне 2 элемента в разметке?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru