同步Android客户端和REST服务器

时间:2012-08-10 17:01:29

标签: android ruby-on-rails rest android-syncadapter

REST服务器

我创建了一个包含:users和关联:comments的Rails服务器。它用作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客户端

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

场景1:阅读评论

  • 用户将显示在Android客户端的列表视图中。
  • 选择了一个用户项目。
  • 列表活动会创建一个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吗?
  4. 我正在努力解决的主要问题是如何设计应用程序?如果您知道如何同步用户及其相关评论的更好解决方案,我们非常欢迎您。

    答案

    问题1和3的答案。
    我按如下方式扩展了REST模型:为注释返回的JSON哈希现在包含关联的用户 id 用户的JSON哈希中也包含相同的 id 。这两个对象都存储在Android设备上的本地数据库中。这允许我为特定的用户请求评论。我只是将服务器用户ID 作为WHERE子句传递。 评论的内容URI不是我提出的问题所隐含的级联。它类似于用户内容URI:

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

    注意,我更改了字符串的权限部分。我决定为用户评论创建separate content provider

1 个答案:

答案 0 :(得分:1)

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

  • 当应用程序打开时,将GCM注册ID发送到您的推送通知服务器(例如uniqush-push,或使用gem to handle the GCM logic发送您自己的服务器),这样您就可以使用它将推送通知发送到用户告诉应用程序更新服务器的评论
  • 根据需要构建初始缓存
  • 每当用户发布评论时,将其发送到服务器并让服务器使用所创建评论的数据进行响应,以便应用程序可以使用该评论,并且如果需要,可以使用返回的id和其他任何内容进行缓存。 / LI>
  • 在服务器上,当发布评论时,循环浏览所有相关用户并使用GCM注册ID向其发送推送通知,这可能就像只有"update_comments": "1"
  • 一样简单
  • 在用户点击推送通知时在应用上,使用对服务器的请求更新评论缓存