同步Android客户端和REST服务器

JJD*_*JJD 6 rest android ruby-on-rails android-syncadapter

REST服务器

我创建了一个包含:users和关联的Rails服务器:comments.它用作Android客户端的后端API.在服务器上加载和存储数据的交换格式是JSON.以下是相关的迁移.

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.timestamps
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

...

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
Run Code Online (Sandbox Code Playgroud)

所有用户都已导入.因此,仅为: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
Run Code Online (Sandbox Code Playgroud)

Android客户端

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

场景1:阅读评论

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

场景2:撰写评论

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

头痛问题

我标记了与以下问题相关的方案步骤.

  1. 如何为CursorLoader用户活动中的a使用的注释创建内容URI ?请注意,此时我只知道用户URI.
  2. 有人可以描述我如何创建同步过程吗?我不确定SyncAdapter是否适用于此处(从未使用过它).同步过程只是Service一方面启动任务来下载,解析和存储客户端上的注释,另一方面加载,编码并向服务器发送注释?
  3. 新评论的内容URI如何?是ContentProvider征求意见的相同用户?SQLiteOpenHelper应用程序中只有一个吗?

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

答案

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

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

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

raf*_*fb3 1

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

  • 当应用程序打开时,将 GCM 注册 ID 发送到您的推送通知服务器(例如uniqush-push,或者您自己的服务器使用gem 来处理 GCM 逻辑),这样您就可以使用它向用户发送推送通知,告诉应用程序更新来自服务器的评论
  • 根据需要构建初始缓存
  • 每当用户发布评论时,将其发送到服务器并使服务器响应所创建评论的数据,以便应用程序可以使用该评论,并且如果需要,可以使用返回的 id 和其他任何内容来缓存它
  • 在服务器上,当发布评论时,循环遍历所有相关用户并使用 GCM 注册 ID 向其发送推送通知,这可能很简单"update_comments": "1"
  • 在应用程序上,当用户点击推送通知时,通过向服务器发出请求来更新评论缓存