Редактировать: Хорошо, так что на самом деле это не решает заданный вопрос, потому что eidylon привязан к существующему ContentProvider, как указано в их вопросе. Однако это касается того, как вы выполняете JOIN, если у вас есть источник ContentProvider и API. Так что я оставлю это для тех, кто хочет знать, как поступить в этом случае.
Это легко! Но неинтуитивно... :)
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()
. Не стесняйтесь использовать его!
Определите поля выбора, как вам нравится. Они не должны сопоставляться с именами столбцов таблицы — сопоставляйте их так, как вам нужно, чтобы получить ваши параметры.
Определите свою проекцию так, как вам нужно -- она может содержать столбцы из обеих таблиц после соединения.
Бинг, все готово. Google использует ту же модель внутри своего собственного кода. Посмотрите на API поставщика контактов — вы видите «bla.RawContact», «bla.Contact» и т. д. в качестве URI контента. Каждый обслуживает данные из одной и той же таблицы в БД — разные URI просто обеспечивают разные представления одной и той же таблицы!
person
jcwenger
schedule
01.07.2011