6

REST サーバー

を含む Rails サーバーを作成し、:users関連付け:commentsました。Android クライアントのバックエンド API として使用されます。サーバーでデータをロードして保存するための交換形式は 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 クライアント

クライアント側ではServicewithを使用しAsyncTasksて、ユーザーをローカルの SQLite データベースにダウンロード、解析、保存します。AContentProviderは、キャッシュされたユーザーを UI に配信します。サーバーからダウンロードされたユーザー オブジェクトには、usersテーブルの一意の ID が含まれています。これは、クライアントで新しいコメントが作成されたときに役立ちます。

シナリオ 1: コメントを読む

  • ユーザーは、Android クライアントのリスト ビューに表示されます。
  • ユーザーアイテムが選択されます。
  • list アクティビティはIntent、ユーザー固有の URI を含むを作成しますcontent://com.example.myapp.provider/users/23
  • ユーザー アクティビティには、ユーザーと関連するコメントに関する詳細情報が表示されます。
  • キャッシュされたコメントは、CursorLoader. (1)
  • 同期プロセスは、リモート サーバーからコメントを読み込みます。(2)

シナリオ 2: コメントを書く

  • ユーザー アクティビティからコメントを作成できます。
  • コメントはローカル データベースに保存されます。(3)
  • 保存されたコメントは、リモート サーバーと同期されます。(2)

頭痛の質問

以下の質問に関連するシナリオのステップにマークを付けました。

  1. CursorLoaderユーザー アクティビティで使用されているコメントのコンテンツ URI を作成するにはどうすればよいですか? この時点では、ユーザー URI しかわかりません。
  2. 誰かが同期プロセスを作成する方法を説明できますか? ここでSyncAdapterが機能するかどうかはわかりません(使用したことはありません)。同期プロセスは、Service一方ではタスクを開始してクライアントでコメントをダウンロード、解析、保存し、他方ではコメントをロード、エンコード、サーバーに送信するだけですか?
  3. 新しいコメントのコンテンツ URI はどのようになりますか? ContentProviderコメント用はユーザー用と同じですか? SQLiteOpenHelperアプリケーションには 1 つしかありませんか?

私が苦労している主な問題は、アプリケーションの設計方法ですか? ユーザーと関連するコメントをどのように同期させるべきかについて、より良い解決策をご存知でしたら、大歓迎です。

回答

質問 1. および 3. に対する回答
。REST モデルを次のように拡張しました。コメントに対して返される JSON ハッシュには、関連するユーザーのIDが含まれるようになりました。userの JSON ハッシュにも同じIDが含まれています。どちらのオブジェクトも、Android デバイスのローカル データベースに保存されます。これにより、特定のユーザーのコメントをリクエストできます。サーバーのユーザー IDを句として渡すだけです。私の質問で示唆したように、コメントのコンテンツ URIはカスケードされません。これは、ユーザーコンテンツ URIに似ています。WHERE

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

文字列の権限部分を変更したことに注意してください。ユーザーコメント用に別のコンテンツ プロバイダーを作成することにしました。

4

1 に答える 1

1

シンプルなアーキテクチャの 1 つは、常にサーバー内のものを最初に更新し、投稿されたコメントをすぐにサーバーに送信し、そこから、更新されたコメント リストを要求する必要があるユーザーにGCMを介して通知をプッシュすることです。フローは次のようになります。

  • アプリが開いているときに、GCM登録IDをプッシュ通知サーバーに送信します(uniqush-push、またはgemを使用してGCMロジックを処理する独自のサーバーなど)。このようにして、アプリに通知するユーザーにプッシュ通知を送信できますサーバーからコメントを更新するには
  • 必要に応じて初期キャッシュを構築します
  • ユーザーがコメントを投稿するたびに、それをサーバーに送信し、作成されたコメントのデータでサーバーが応答するようにします。これにより、アプリはそれを使用し、必要に応じて、返された ID などを使用してキャッシュすることができます。
  • サーバー上でコメントが投稿されたら、関連するすべてのユーザーをループし、GCM 登録 ID を使用してプッシュ通知を送信します。"update_comments": "1"
  • ユーザーがプッシュ通知をタップしたときにアプリ上で、サーバーへのリクエストでコメント キャッシュを更新します。
于 2014-11-22T20:51:44.080 に答える