REST 服务器
我创建了一个包含: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
安卓客户端
在客户端,我使用Service
withAsyncTasks
来下载、解析用户并将其存储到本地 SQLite 数据库中。AContentProvider
将缓存的用户传递到 UI。从服务器下载的用户对象包含users
表的唯一 id。当在客户端上创建新评论时,这应该很有用。
场景一:阅读评论
- 用户显示在 Android 客户端的列表视图中。
- 用户项目被选中。
- 列表活动创建一个
Intent
包含用户特定 URI,例如content://com.example.myapp.provider/users/23
. - 用户活动显示有关用户和相关评论的详细信息。
- 缓存的评论通过
CursorLoader
. (1) - 同步过程从远程服务器加载评论。(2)
场景 2:写评论
- 可以从用户活动创建评论。
- 评论被存储到本地数据库中。(3)
- 存储的评论与远程服务器同步。(2)
头痛问题
我标记了与以下问题相关的场景步骤。
- 如何为
CursorLoader
用户活动中与 a 一起使用的评论创建内容 URI?请注意,此时我只知道用户 URI。 - 有人可以描述我如何创建同步过程吗?我不确定SyncAdapter是否在这里工作(从未使用过)。同步过程是否只是
Service
一方面启动任务以在客户端下载、解析和存储评论,另一方面加载、编码并将评论发送到服务器? - 新评论的内容 URI 是什么样的?
ContentProvider
评论和用户一样吗?申请中只有一个SQLiteOpenHelper
吗?
我正在努力解决的主要问题是如何设计应用程序?如果您知道我应该如何同步用户及其相关评论的更好解决方案,非常欢迎您。
答案
问题 1 和 3 的答案。
我将 REST 模型扩展如下:为评论返回的 JSON 哈希现在包括关联用户的id。相同的id也包含在user的 JSON 哈希中。这两个对象都存储在 Android 设备上的本地数据库中。这允许我为特定用户请求评论。我只是将服务器用户 ID作为子句传递。正如我在问题中暗示的那样,评论的内容 URI没有级联。它类似于用户内容 URI:WHERE
content://com.example.myapp.provider.commentsprovider/comments
请注意,我更改了字符串的权限部分。我决定为用户和评论创建单独的内容提供者。