Синхронизировать клиент Android и сервер REST

REST-сервер

Я создал сервер Rails, содержащий :usersи связанный с ним :comments. Он используется в качестве внутреннего API для клиента Android. Формат обмена для загрузки и хранения данных на сервере — JSON. Вот соответствующие миграции.

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.timestamps
    end
  end
end

...

class CreateComments < ActiveRecord::Migration
  def change
    create_table :comments do |t|
      t.references :users
      t.string :subject
      t.text :message
      t.timestamps
    end
  end
end

Все пользователи уже импортированы. Поэтому для ресурса :usersнастроен доступ только для чтения. Таким образом, для :commentsдолжна быть возможность добавления новых записей. Вот доступные маршруты.

   user_comments GET   /users/:user_id/comments(.:format)      comments#index
                 POST  /users/:user_id/comments(.:format)      comments#create
new_user_comment GET   /users/:user_id/comments/new(.:format)  comments#new
    user_comment GET   /users/:user_id/comments/:id(.:format)  comments#show
           users GET   /users(.:format)                        users#index
            user GET   /users/:id(.:format)                    users#show

Android-клиент

На стороне клиента я использую Serviceс AsyncTasksдля загрузки, анализа и сохранения пользователей в локальной базе данных SQLite. ContentProviderдоставляет кэшированных пользователей в пользовательский интерфейс. Пользовательский объект, загруженный с сервера, содержит уникальный идентификатор таблицы users. Это должно быть полезно, когда на клиенте создается новый комментарий.

Сценарий 1 :Читать комментарии

  • Пользователи отображаются в виде списка на клиенте Android.
  • Выбирается пользовательский элемент.
  • Активность списка создает Intent, который содержит пользовательский URI, например. content://com.example.myapp.provider/users/23.
  • Пользовательская активность отображает подробную информацию о пользователе и связанных с ним комментариях.
  • Кэшированные комментарии загружаются через CursorLoader. (1)
  • Процесс синхронизации загружает комментарии с удаленного сервера. (2)

Сценарий 2 :Написать комментарий

  • Комментарий может быть создан из активности пользователя.
  • Комментарий сохраняется в локальной базе данных. (3)
  • Сохраненные комментарии синхронизируются с удаленным сервером. (2)

Вопросы о головной боли

Я отметил шаги сценария, связанные со следующими вопросами.

  1. Как создать URI контента для комментариев, используемых с CursorLoaderв активности пользователя? Обратите внимание, на данный момент я знаю только URI пользователя.
  2. Может кто-нибудь описать, как мне создать процесс синхронизации? Я не уверен, работает ли здесь SyncAdapter (никогда не использовал его ). Является ли процесс синхронизации всего лишь Service, который, с одной стороны, запускает задачи по загрузке, анализу и хранению комментариев на клиенте, а с другой — загружает, кодирует и отправляет комментарии на сервер?
  3. Как выглядит URI контента для нового комментария? ContentProviderдля комментариев такой же, как и для пользователей? В приложении только один SQLiteOpenHelper?

Основная проблема, с которой я борюсь, заключается в том, как разработать приложение? Если вы знаете лучшее решение о том, как мне синхронизировать пользователей и связанные с ними комментарии, добро пожаловать.

Ответы

Ответы на вопрос 1. и 3.
Я расширил модель REST следующим образом :Хэш JSON, возвращаемый для комментария , теперь включает идентификатор связанного пользователя .Тот же идентификатор также включен в хэш JSON для пользователя . Оба объекта хранятся в локальной базе данных на устройстве Android. Это позволяет мне запрашивать комментарии для конкретного пользователя . Я просто передаю идентификатор пользователя сервера как предложение WHERE. URI контента для комментариев не каскадируется, как я подразумевал в своем вопросе. Он аналогичен пользовательскому URI контента :

content://com.example.myapp.provider.commentsprovider/comments

. Обратите внимание, что я изменил часть полномочий строки. Я решил создать отдельный контент-провайдер для пользователей и комментариев .

6
задан Community 23 May 2017 в 10:30
поделиться