Как обрабатывать RESTful-обновление удаленного сервера с помощью SyncAdapter

Я наблюдал выступление Google I / O REST и прочтите слайды: http://www.google.com/events/io/2010/sessions/developing-RESTful-android-apps.html

Я все еще немного неясно, как правильно обрабатывать, скажем, ошибку обновления, вызванную удаленным сервером. Я реализовал свои собственные ContentProvider и SyncAdapter. Рассмотрим следующий сценарий:

Обновите контактную информацию пользователя с помощью вызова REST:

  1. Запросите обновление с помощью ContentResolver.
  2. Мой ContentProvider немедленно обновляет локальную базу данных Sqlite приложения и запрашивает синхронизацию (согласно рекомендациям в докладе Google I / O).
  3. My SyncAdapter.onPerformSync () вызывается и выполняет вызов REST для обновления удаленных данных.
  4. Удаленный сервер отвечает сообщением «ОШИБКА: неверный номер телефона» (например).

Мой вопрос: как лучше всего SyncAdapter сигнализировать моему ContentProvider о том, что это изменение необходимо отменить из локальной базы данных приложения, а также сигнализировать моей Activity о том, что запрос на обновление не выполнен (и передать сообщения об ошибках, возвращаемые сервером)?

Моя операция должна отображать счетчик хода выполнения, ожидая результата, и знать, был ли запрос успешным или неудачным.


Для обновления локальной базы данных приложения контентом с Сервера мне кажется вполне понятным шаблон SyncAdapter, и у меня это нормально работает. Но для обновлений от приложения до сервера я не могу найти хороший способ справиться с описанным выше сценарием.


И еще кое-что ...;)

Скажем, я вызываю ContentResolver.notifyChange (uri, null, true); из моего метода ContentProvider update (). true вместе с android: supportsUploading = "true" вызовет onPerformSync () моего SyncAdapter. Отлично, но внутри onPerformSync () как мне узнать, какой URI мне следует синхронизировать? Я не хочу просто обновлять всю свою БД каждый раз, когда получаю запрос на синхронизацию. Но вы даже не можете передать Bundle в notifyChangeCall () для передачи в onPerformSync ().

Все примеры onPerformSync (), которые я видел, были такими простыми, и без использования специального ContentProvider, какие-нибудь реальные примеры? А документы - это что-то вроде птичьего гнезда. Вирджил Добьянски, сэр, вы оставили меня на берегу ручья без весла.

20
задан JJD 18 August 2012 в 11:16
поделиться