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