Редактировать: Хорошо, так что это фактически не решает заданный вопрос, потому что eidylon привязан к существующему ContentProvider, как упомянуто в их вопросе.Однако, это действительно касается того, как вы выполняете JOIN, если у вас есть источник и API ContentProvider.Поэтому я оставлю это для тех, кто хочет знать, как обращаться с этим делом.
Это просто!Но не интуитивно понятно ...:)
query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder)
Хорошо, а что такое URI?Как правило, у вас есть один URI на таблицу.
content://com.example.coolapp.contacts
обслуживает данные из вашей таблицы CONTACTS
.content://com.example.coolapp.groupmembers
подает данные из вашей таблицы GROUPMEMBERSHIP
.
Но URI - это просто строка.Используйте его так, как вам нравится.Создайте блок кода в вашем ContentProvider, который отвечает на content://com.example.coolapp.contacts_in_group
.Внутри этого блока кода в ContentProvider вы можете получить необработанный доступ к вашей базе данных SQLite, не ограниченный ограниченной моделью данных query()
.Не стесняйтесь использовать его!
Определите поля выбора, как вам нравится.У них нет для сопоставления с именами столбцов таблицы - сопоставьте их так, как вам нужно, чтобы получить ваши параметры.
Определите свою проекцию так, как вам нужно - это можетсодержать столбцы из обеих таблиц после объединения.
Bing, все готово.Google делает эту же модель внутренне в своем собственном коде - посмотрите на API провайдера контактов - вы видите «bla.RawContact» и «bla.Contact» и т. Д. В качестве URI контента.Каждый обслуживает данные из одной и той же таблицы в БД - разные URI просто предоставляют разные представлений этой же таблицы!