同步Android应用程序和web服务器之间的数据

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

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

  1. 每个用户都有属于自己的一部分服务器空间(例如EvernoteDropbox)。可能用户通过手机创建新记录,并在服务器中创建新记录。我怎样才能把这些记录匹配在一起呢?如果有相同ID的记录你建议我用什么算法?< / >强

  2. 除了JSON手机设备和服务器之间是否有任何发送数据的方法?< / >强

  3. 如果SyncAdapterContentProvider可以解决我的问题,请详细解释给我听。(如果你能提供一些样品或教程给我,或者任何建议或关键词来帮助拓宽/指导我的搜索,我也将不胜感激)。

210501 次浏览

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

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

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

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

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

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

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

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

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

希望这是一个好的开始。

parseplatform.org

(你也可以在back4app.com上购买商业包。)

它是一个非常直接和用户友好的服务器端数据库服务,提供了一个伟大的android客户端API

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

我将试图通过解决更大的问题来回答你所有的问题:如何在web服务器和android应用程序之间同步数据?< / em >


在你的web服务器和android应用程序之间同步数据需要你的android设备上的几个不同的组件。

持久性存储:

这就是你的手机如何存储它从网络服务器接收到的数据。实现这一点的一种可能的方法是编写自己的自定义内容提供者,并支持Sqlite数据库。关于内容提供者的一个不错的教程可以在这里找到:http://thinkandroid.wordpress.com/2010/01/13/writing-your-own-contentprovider/

内容提供者定义了一个与存储数据交互的一致接口。如果您需要,它还允许其他应用程序与您的数据进行交互。在你的内容提供者后面可以是一个Sqlite数据库,一个缓存,或任何任意的存储机制。

虽然我肯定会推荐使用内容提供者和Sqlite数据库,但你可以使用任何你想要的基于java的存储机制。

数据交换格式:

这是你用来在你的web服务器和android应用程序之间发送数据的格式。现在最流行的两种格式是XML和JSON。在选择格式时,应该考虑可用的序列化库类型。我知道有一个很棒的json序列化库,名为gson: https://github.com/google/gson,尽管我确信类似的库也存在于XML中。

同步服务

您将需要某种异步任务,它可以从服务器获取新数据并刷新移动内容以反映服务器的内容。您还需要在对内容进行本地更改并希望反映这些更改时通知服务器。Android提供了SyncAdapter模式作为一种轻松解决此模式的方法。你需要注册用户帐户,然后Android会为你执行许多神奇的操作,并允许你自动同步。这里有一个很好的教程:http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/


至于如何识别记录是否相同,通常你会创建具有唯一id的项目,并将其存储在android设备和服务器上。你可以用它来确保你引用的是同一个引用。此外,您可以存储像“updated_at”这样的列属性,以确保始终获得最新的数据,或者不会意外地重写新写入的数据。

@Grantismo给出了一个很好的Android同步组件的概述。

SyncManagerAndroid库提供了一个简单的双向同步实现来插入Android同步框架(AbstractThreadedSyncAdapter.OnPerformSync)。

https://github.com/sschendel/SyncManagerAndroid

@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

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

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

  • SyncAdapter:应用程序中的同步适配器组件封装了在设备和服务器之间传输数据的任务的代码。基于你在应用程序中提供的调度和触发器,同步适配器框架运行同步适配器组件中的代码。

  • < a href = " https://realm。io/" rel="noreferrer">Realm: Realm是一个移动数据库:代替SQLite &核心数据。

  • < a href = " http://square.github。io/retrofit/" rel="noreferrer"> retrofit Square, Inc.的Android和Java类型安全的HTTP客户端。必修课 a-smart-way-to-use-retrofit < / >

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

祝所有新学员好运。:)

例如,你想要将表todoTableMySql同步到Sqlite

首先,在todoTable中为SqliteMySql创建一个列名为version (type INT) enter image description here < / p > 其次,创建一个表名为database_version,其中一个列名为currentVersion(INT)
enter image description here < / p > 在MySql中,当你向todoTable添加一个新项目或更新项目时,你必须将这个项目的版本升级+1,而则升级currentVersion enter image description here < / p >

Android中,当你想要同步(通过手动按下同步按钮或服务运行周期时间):

你将用Sqlite currentVersion(当前为1)发送请求到服务器 然后在服务器中,你会发现MySql中哪个项目的版本值大于Sqlite currentVersion(1),然后响应Android(在这个例子中,版本2的项目3将响应Android)

SQLite中,你将添加或更新新项目到todoTable并升级currentVersion