同步Android客户端和REST服务器

6

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客户端

在客户端,我使用一个 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 吗?

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

答案

问题1和3的答案:
我扩展了REST模型,现在返回给评论的JSON哈希包括关联用户id。同样的id也包含在用户的JSON哈希中。这两个对象都存储在Android设备的本地数据库中。这使我可以请求特定用户评论。我只需将服务器用户id作为WHERE子句传递即可。与我在问题中暗示的级联用户内容URI不同,评论的内容URI类似于用户内容URI:

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

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


针对您的查询,我在https://dev59.com/pmsz5IYBdhLWcg3wR1vC#12015967上添加了我最终得出的解决方案的解释。 - Jarrod Smith
可能是重复的问题:如何使用SyncAdapter处理远程服务器的RESTful更新 - Peter O.
1
你是否排除了将Rails后端作为独立数据库而不使用本地sqlite的可能性?我使用Volley在Android客户端和Rails API之间运行网络数据。它工作得很好,没有需要担心的数据同步问题。性能也非常不错(即使对于每个事务都使用SSL)。此外,如果你还没有尝试过Android的Volley,我强烈建议你去尝试一下。祝你好运! - settheline
1个回答

1

一种简单的架构是首先在服务器上更新内容,立即将发布的评论发送到服务器,并从那里通过GCM向应该请求更新的用户发送通知。流程如下:

  • 打开应用程序时,将GCM注册ID发送到您的推送通知服务器(例如uniqush-push或使用处理GCM逻辑的gem的自己的服务器),这样您就可以使用它向用户发送推送通知,告诉应用程序从服务器更新评论
  • 按照您想要的方式构建初始缓存
  • 每当用户发表评论时,请将其发送到服务器,并使服务器响应已创建评论的数据,以便应用程序可以使用返回的ID和其他任何内容进行缓存
  • 在服务器端,当发表评论时,请遍历所有相关用户并使用GCM注册ID发送推送通知,它可以简单地只有"update_comments": "1"
  • 当用户点击推送通知时,请使用对服务器的请求更新评论缓存

我尝试添加链接编辑,但出现错误,指出我的代码格式不正确,因此这些是链接:gcmuniqushgcm gems - rafb3
是的,某种推送通知机制听起来很有用。当时我在那个项目上没有实现这个功能。我可能会在接下来的几个月里再次解决这个问题。 - JJD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接