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 クライアント
クライアント側ではService
withを使用しAsyncTasks
て、ユーザーをローカルの SQLite データベースにダウンロード、解析、保存します。AContentProvider
は、キャッシュされたユーザーを UI に配信します。サーバーからダウンロードされたユーザー オブジェクトには、users
テーブルの一意の ID が含まれています。これは、クライアントで新しいコメントが作成されたときに役立ちます。
シナリオ 1: コメントを読む
- ユーザーは、Android クライアントのリスト ビューに表示されます。
- ユーザーアイテムが選択されます。
- list アクティビティは
Intent
、ユーザー固有の URI を含むを作成しますcontent://com.example.myapp.provider/users/23
。 - ユーザー アクティビティには、ユーザーと関連するコメントに関する詳細情報が表示されます。
- キャッシュされたコメントは、
CursorLoader
. (1) - 同期プロセスは、リモート サーバーからコメントを読み込みます。(2)
シナリオ 2: コメントを書く
- ユーザー アクティビティからコメントを作成できます。
- コメントはローカル データベースに保存されます。(3)
- 保存されたコメントは、リモート サーバーと同期されます。(2)
頭痛の質問
以下の質問に関連するシナリオのステップにマークを付けました。
CursorLoader
ユーザー アクティビティで使用されているコメントのコンテンツ URI を作成するにはどうすればよいですか? この時点では、ユーザー URI しかわかりません。- 誰かが同期プロセスを作成する方法を説明できますか? ここでSyncAdapterが機能するかどうかはわかりません(使用したことはありません)。同期プロセスは、
Service
一方ではタスクを開始してクライアントでコメントをダウンロード、解析、保存し、他方ではコメントをロード、エンコード、サーバーに送信するだけですか? - 新しいコメントのコンテンツ URI はどのようになりますか?
ContentProvider
コメント用はユーザー用と同じですか?SQLiteOpenHelper
アプリケーションには 1 つしかありませんか?
私が苦労している主な問題は、アプリケーションの設計方法ですか? ユーザーと関連するコメントをどのように同期させるべきかについて、より良い解決策をご存知でしたら、大歓迎です。
回答
質問 1. および 3. に対する回答
。REST モデルを次のように拡張しました。コメントに対して返される JSON ハッシュには、関連するユーザーのIDが含まれるようになりました。userの JSON ハッシュにも同じIDが含まれています。どちらのオブジェクトも、Android デバイスのローカル データベースに保存されます。これにより、特定のユーザーのコメントをリクエストできます。サーバーのユーザー IDを句として渡すだけです。私の質問で示唆したように、コメントのコンテンツ URIはカスケードされません。これは、ユーザーコンテンツ URIに似ています。WHERE
content://com.example.myapp.provider.commentsprovider/comments
文字列の権限部分を変更したことに注意してください。ユーザーとコメント用に別のコンテンツ プロバイダーを作成することにしました。