6

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

安卓客户端

在客户端,我使用ServicewithAsyncTasks来下载、解析用户并将其存储到本地 SQLite 数据库中。AContentProvider将缓存的用户传递到 UI。从服务器下载的用户对象包含users表的唯一 id。当在客户端上创建新评论时,这应该很有用。

场景一:阅读评论

  • 用户显示在 Android 客户端的列表视图中。
  • 用户项目被选中。
  • 列表活动创建一个Intent包含用户特定 URI,例如content://com.example.myapp.provider/users/23.
  • 用户活动显示有关用户和相关评论的详细信息。
  • 缓存的评论通过CursorLoader. (1)
  • 同步过程从远程服务器加载评论。(2)

场景 2:写评论

  • 可以从用户活动创建评论。
  • 评论被存储到本地数据库中。(3)
  • 存储的评论与远程服务器同步。(2)

头痛问题

我标记了与以下问题相关的场景步骤。

  1. 如何为CursorLoader用户活动中与 a 一起使用的评论创建内容 URI?请注意,此时我只知道用户 URI。
  2. 有人可以描述我如何创建同步过程吗?我不确定SyncAdapter是否在这里工作(从未使用过)。同步过程是否只是Service一方面启动任务以在客户端下载、解析和存储评论,另一方面加载、编码并将评论发送到服务器?
  3. 新评论的内容 URI 是什么样的?ContentProvider评论和用户一样吗?申请中只有一个SQLiteOpenHelper吗?

我正在努力解决的主要问题是如何设计应用程序?如果您知道我应该如何同步用户及其相关评论的更好解决方案,非常欢迎您。

答案

问题 1 和 3 的答案。
我将 REST 模型扩展如下:为评论返回的 JSON 哈希现在包括关联用户的id。相同的id也包含在user的 JSON 哈希中。这两个对象都存储在 Android 设备上的本地数据库中。这允许我为特定用户请求评论。我只是将服务器用户 ID作为子句传递。正如我在问题中暗示的那样,评论的内容 URI没有级联。它类似于用户内容 URI:WHERE

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

请注意,我更改了字符串的权限部分。我决定为用户评论创建单独的内容提供者

4

1 回答 1

1

一种简单的架构是始终首先更新服务器中的内容,立即将发布的评论发送到服务器,然后通过GCM将通知推送给应该请求更新评论列表的用户。流程看起来像:

  • 当应用程序打开时,将 GCM 注册 ID 发送到您的推送通知服务器(例如uniqush-push或您自己的服务器使用gem 来处理 GCM 逻辑),这样您就可以使用它向用户发送推送通知,告诉应用程序从服务器更新评论
  • 根据需要构建初始缓存
  • 每当用户发表评论时,将其发送到服务器并让服务器响应所创建评论的数据,因此应用程序可以使用该评论并在需要时使用返回的 id 和其他任何内容缓存它
  • 在服务器上,当发表评论时,遍历所有相关用户并使用 GCM 注册 ID 向其发送推送通知,这可能就像刚刚"update_comments": "1"
  • 在应用程序上,当用户点击推送通知时,通过对服务器的请求更新评论缓存
于 2014-11-22T20:51:44.080 回答