Как обрабатывать вызовы REST, постоянство данных, синхронизацию и наблюдение ContentProvider

Я знаю, что этот вопрос задавался слишком много раз, но я думаю, что проблемы, которые я пытаюсь настроить, немного отличаются друг от друга, может быть, более сложными.

Я собираюсь разработать приложение, которое использует веб-службу RESTful и должно иметь следующие требования:

Вопросы :

После просмотра и изучения всех компонентов, предложенных Вирджилом Добжанщи в Google I / O 2010 , я сомневаюсь:

  1. Как я могу прозрачно обрабатывать концепцию « сущность-обновление » для любого вызывающего? Должен ли я использовать ContentObserver на ContentObserver мне придется реализовать?

  2. Если я использую ContentObserver я могу легко установить флаг состояния для единственного объекта (как это было предложено Dobjanschi), например INSERTING , INSERTING и т. Д. Но как я должен обрабатывать список? Скажем, мне нужен список книг, где я должен поставить флаг состояния? Должен ли я помещать его в таблицу состояния только для списков? Если это так, я должен наблюдать два Cursor s, один для статуса и один для фактического списка (т. Е. URI таблицы / содержимого). И что, если сущность, о которой я прошу, пока не существует, или вызов REST возвращает 404 ? Как мне обрабатывать обратный вызов?

  3. Если я поместил все свои методы REST в **SyncAdapter** , могу ли я заставить « SyncAdapter обновить список сущностей / сущностей из сети (и, следовательно, поместить его в правильную таблицу)? Таким образом, флаг состояния будет полезен.

  4. Может ли SyncAdapter работать с несколькими объектами (на самом деле, сущностями , так как я хочу SyncAdapter обновлять книги и редакторы), так как он имеет performSync метод performSync ?

  5. Если моя реализация SyncAdapter была отключена пользователем в настройках устройства, она ничего не обновит (и все в порядке). Но если пользователь нажимает кнопку «Обновить книги» в performSync , могу ли я по-прежнему вызывать метод performSync или он будет также отключен?

SyncAdapter – это шаблон проектирования, включающий пять компонентов:

  1. Приложение. Это использует набор Activity вместе с Cursor и ContentObserver и, возможно, CursorAdapter а некоторые – для предоставления пользовательского интерфейса локально сохраненным данным ContentProvider .
  2. ContentProvider локального устройства. Обрабатывает вызовы CRUD, обрабатывает уведомление SyncAdapter о необходимости SyncAdapter обновления на сервер.
  3. Account Идентификатор пользователя на удаленном сервере.
  4. SyncAdapter Фоновый процесс, который запускается, и сохраняет локальный хранилище данных в синхронизации с сервером.
  5. Сам сервер.

Так. На вопросы:

  1. «Is-update» означает «имеет локальные изменения, которые еще не были перенесены на сервер. Это флаг, который вы устанавливаете в строке в своей базе данных. Он установлен в ContentProvider при создании / обновлении / удалении строки. Когда запускается SyncAdapter , Он видит флаг, толкает обновление на сервер, очищает флаг. Сам флаг выполняет две вещи:
    а. Сообщает пользователю, что приложение занято сохранением изменений, и когда это будет сделано.
    б. Помечает строку как измененную, поэтому SyncAdapter знает, чтобы нажать ее на сервер.
    Читайте здесь для более подробной информации.

  2. Если вы не синхронизируете весь каталог, ваш клиент будет напрямую запрашивать сервер и кэшировать результаты, помещая их в ContentProvider. Там нет флага статуса, поскольку они поступают с сервера и, следовательно, соответствуют состоянию сервера. Напишите свой SyncAdapter, чтобы игнорировать их, или, возможно, отбросить их после того, как они были кэшированы через несколько дней.

  3. а. Чтобы ваши локальные обновления отправлялись на сервер, вы пишете ContentProvider, чтобы уведомить SyncAdapter во время вызовов Create / Update / Delete ContentProvider. (Читайте здесь …)
    б. Чтобы периодически получать обновления с сервера, вы настраиваете учетную запись для автоматической синхронизации. (Читайте здесь …)

  4. Да. PerformSync – это просто вызов функции. Напишите его, чтобы делать то, что вы хотите. Принесите таблицу 1 из сервера и поместите ее в одну таблицу в ContentProvider. Затем заберите таблицу 2 и поместите ее в другую таблицу. И т.п.

  5. а. Вы можете принудительно ContentResolver.RequestSync() синхронизацию, вызвав ContentResolver.RequestSync() с ContentResolver.SYNC_EXTRAS_MANUAL в комплекте ContentResolver.SYNC_EXTRAS_MANUAL .
    б. Вы можете вручную извлечь что-то с кодом клиента и напрямую вставить его в ContentProvider.

Если вы посмотрите раздел « Запуск адаптера синхронизации » в Google Developers Training , вы найдете подробное описание того, как:

  1. Запуск адаптера синхронизации при изменении данных сервера
  2. Запуск адаптера синхронизации при изменении данных поставщика контента
  3. Запуск адаптера синхронизации после сетевого сообщения
  4. Запуск адаптера синхронизации периодически
  5. Запуск адаптера синхронизации по требованию