我想在Android应用程序和服务器之间同步数据(如db记录,媒体)。如果你看过Evernote或类似的应用程序,你肯定能理解我的意思。

我有一些问题(假设我们想要同步DB记录):

Every user has a part of server space for himself (such as Evernote or Dropbox). Maybe the user creates new records by cellphone and creates new records in server. How can I match these records together? If there are records with same ID What algorithms do you suggest me? Except JSON, Are there any way for send data between cellphone device and server? If SyncAdapter and ContentProvider can solve my problems, please explain exactly for me. (If you could offer some samples or tutorials to me OR Any advice or keywords to help broaden/guide my search would be appreciated as well).


当前回答

如果你自己写,这些要点要记住

设备与同步服务器之间的正确认证

设备和服务器之间的同步协议。它通常分为3个阶段:身份验证、数据交换、状态交换(哪些操作有效,哪些操作失败)。

选择有效载荷格式。我建议使用基于SyncML的XML和基于JSON的格式来表示实际数据。因此,协议使用SyncML,实际交换的数据使用JSON。在操作数据时使用JSON数组总是首选,因为使用JSON数组很容易访问数据。

跟踪客户端和服务器上的数据更改。您可以维护更改的id的变更日志,并在同步会话期间获取它们。另外,当对象成功同步时,清除更改日志。您还可以使用一个布尔变量来确认同步状态,即最后一次同步。这将有助于最终用户确定最后一次同步完成的时间。

需要有一种从服务器到设备的通信方式,以便在服务器上的数据发生变化时启动同步会话。您可以使用C2DM或编写自己的基于tcp的持久通信。tcp方法是无缝的

跨多个设备复制数据更改的方法

最后但并非最不重要的是,一种检测和处理冲突的方法

希望这是一个好的开始。

其他回答

@Grantismo提供了一个很好的整体解释。如果你想知道谁实际上在做这些事情,我建议你看看谷歌是如何为谷歌IO应用程序的2014年(它总是值得深入研究这些应用程序的源代码,他们发布。这里有很多值得学习的地方)。

这里有一篇关于它的博客文章:http://android-developers.blogspot.com.br/2014/09/conference-data-sync-gcm-google-io.html

从本质上讲,在应用端:GCM用于发送信号,同步适配器用于数据获取,并与内容提供者进行正确的对话,这将使事情持久(是的,它将DB与应用程序的其他部分直接访问隔离开来)。

另外,如果你想看一下2015年的代码:https://github.com/google/iosched

实现这一点的一种方法是让服务器端应用程序等待数据。可以使用Java中的HttpRequest对象发送数据,也可以编写自己的TCP/IP数据传输实用程序。可以使用JSON格式或您认为合适的任何其他格式发送数据。此外,如果数据包含敏感信息,则可以在发送到服务器之前进行加密。所有服务器应用程序所要做的就是等待httprequest进入并解析数据并将其存储在你想要的任何地方。

如果你自己写,这些要点要记住

设备与同步服务器之间的正确认证

设备和服务器之间的同步协议。它通常分为3个阶段:身份验证、数据交换、状态交换(哪些操作有效,哪些操作失败)。

选择有效载荷格式。我建议使用基于SyncML的XML和基于JSON的格式来表示实际数据。因此,协议使用SyncML,实际交换的数据使用JSON。在操作数据时使用JSON数组总是首选,因为使用JSON数组很容易访问数据。

跟踪客户端和服务器上的数据更改。您可以维护更改的id的变更日志,并在同步会话期间获取它们。另外,当对象成功同步时,清除更改日志。您还可以使用一个布尔变量来确认同步状态,即最后一次同步。这将有助于最终用户确定最后一次同步完成的时间。

需要有一种从服务器到设备的通信方式,以便在服务器上的数据发生变化时启动同步会话。您可以使用C2DM或编写自己的基于tcp的持久通信。tcp方法是无缝的

跨多个设备复制数据更改的方法

最后但并非最不重要的是,一种检测和处理冲突的方法

希望这是一个好的开始。

如果我们想想今天,公认的答案太陈旧了。正如我们所知道的,我们有很多新的库可以帮助你制作这种类型的应用程序。

你应该学习以下话题,这对你一定有帮助:

SyncAdapter:应用程序中的同步适配器组件封装了在设备和服务器之间传输数据的任务代码。基于你在应用程序中提供的调度和触发器,同步适配器框架运行同步适配器组件中的代码。 Realm: Realm是一个移动数据库:SQLite和Core Data的替代品。 为Android和Java改进类型安全的HTTP客户端。必须学会一种聪明的方法来使用改造

你的数据库同步逻辑是:如何同步Android手机上的SQLite数据库和服务器上的MySQL数据库?

祝所有新学员好运。:)

我建议使用类似于Hessian的二进制web服务协议。它工作得很好,他们确实有一个android实现。它可能有点重,但取决于您正在构建的应用程序。希望这能有所帮助。