Рекомендации по подключению таблиц и уведомление ContentObservers в Android ContentProvider
У меня есть ContentProvider, который обрабатывает все вставки и извлечения данных, связанные с моим приложением, я следую шаблону, предложенному Вирджилом Добжански в Google I/O. Я использую первый шаблон.
Моя проблема в том, что у меня есть логическая сущность, которая была представлена несколькими таблицами в базе данных.
Например, у меня есть таблица статей и таблица ArticleExtras. Статьи представляют собой самую статью, а ArticleExtras представляет дополнительную информацию об определенной статье, например, количество комментариев.
Я использовал CursorAdapter в пользовательском интерфейсе, чтобы отобразить заголовок статьи и количество комментариев этой статьи в одной строке ListView.
Чтобы реализовать это, я добавил инструкцию left outer join ArticleExtras on
в свой метод запроса ContentProvider для таблицы статей, чтобы CursorAdapter мог получить ArticleExtras вместе с самой статьей.
Когда новые статьи извлекаются из Интернета, я вставляю их в базу данных через ContentProvider, а затем CursorAdapter получает уведомление и обновляет пользовательский интерфейс, эта часть работала, как ожидалось.
Но когда я получил количество комментариев (ArticleExtras), я хочу, чтобы тот же CursorAdapter, который следит за изменениями в content://com.myapp.content/Articles
, также должен быть уведомлен, поэтому я могу обновить свою строку в ListView.
Моя текущая реализация такова: после вставки в базу данных ArticleExtras, я запускаю новый запрос, чтобы проверить, есть ли в таблице статей таблицы, которые связаны с только что вставленными статьями ArticleExtras. Если это так, я сделаю новый uri для этой статьи (например: content://com.myapp.cotent/Articles/123
) и вызовет getContext().getContentResolver().notifyChange(uri, null)
, поэтому будет уведомлен соответствующий CursorAdapter, который следит за изменениями этой статьи.
Правилен ли подход, или есть лучший способ реализовать то, что я хочу?
Ответы
Ответ 1
Оформить заказ ContactsProvider2, в нем они устанавливают uri уведомлений на AUTHORITY_URI
, который выглядит как catch для других URI в провайдере. У меня был такой же пробный номер, и я сам пробовал это для провайдера с несколькими таблицами и присоединяется к этим таблицам, и он отлично работает.