Android-контакты и объединение таблиц вообще невозможно?

В настоящее время я разрабатываю приложение для набора номера для ОС Android.

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

я использую CursorAdapter и CursorLoader для заполнения списка. Это очень важно для производительности. До этого момента все работает и абсолютно ясно.

Теперь проблема: мне нужно объединить 2-3 таблицы из базы данных контактов по умолчанию (contacts2.db) в одном запросе sql. Поэтому мое приложение не должно использовать собственную частную базу данных. Но существующие ContentProviders не предлагают доступ более чем к одной таблице. --> ПРОБЛЕМА!

Реализуя свой собственный ContentProvider, можно выполнять соединения с использованием SQLiteQueryBuilder. Но на первый взгляд кажется, что это работает только для частных баз данных. Когда я пытаюсь получить прямой доступ к contact2.db, расположенному в:

/data/data/com.android.providers.contacts/databases/contacts2.db

Я получаю следующую ошибку:

Failed to open database '/data/data/com.android.providers.contacts/databases/contacts2.db'.
                                 android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (Sqlite code 14): Could not open database, (OS error - 13:Permission denied)

Что так или иначе ожидаемо, потому что у каждого приложения есть собственное хранилище, использующее соответствующий uid в базовой файловой системе Linux.

Итак, как я могу получить доступ для чтения к этой базе данных? Могу ли я как-то запросить этот db-объект из системы Android или с помощью объекта Context? Или я могу как-то получить эти права доступа?

Можно ли использовать то же AUTHOTITY_NAME, что и приложение для контактов?? Как это:

com.android.providers.contacts
  • Я не заинтересован в объединении столбцов с использованием java-кода, это УЖАСНО, ОЧЕНЬ МЕДЛЕННО, и мне все равно нужен курсор вместо списка или подобных вещей.
  • Мне не нужна помощь в SQL
  • Мне не нужна помощь в том, как реализовать вещи для Android

Все вы, Android-профессионалы, это вообще возможно? Или API андроида действительно такой дрянной? Мне действительно нужно «присоединиться» к необходимой информации с помощью CursorJoiner и каким-то образом сгенерировать объект Cursor из первого?

Заранее большое спасибо, народ!


person Armin Leghissa    schedule 05.03.2017    source источник


Ответы (2)


Вы не знаете. Вы даже не можете предположить, что это имя контактной базы данных на данном устройстве. Единственный способ получить доступ к базе данных контактов на всех устройствах — использовать ContentResolver.

person Gabe Sechan    schedule 05.03.2017

Похоже, вы ищете Match a Contact By Any Type of Data, как показано Получение списка Контактов официальный урок Android. Вам нужно будет выполнить все 4 шага:

Запросить разрешение на чтение поставщика
Сопоставить контакт по имени и перечислить результаты
Сопоставить контакт по определенному типу данных
Сопоставить контакт по любому типу данных

Потому что шаг 4 основан на коде, созданном предыдущими шагами.

По сути, он использует встроенную функцию поиска в структуре контактов Android: Контакты.CONTENT_FILTER_URI:

Используйте Contacts.CONTENT_FILTER_URI в качестве базового URI и добавьте к нему строку поиска, вызвав Uri.withAppendedPath(). Использование этого URI автоматически запускает поиск любого типа данных.

person marmor    schedule 07.03.2017