我要同步数据(如数据库记录,媒体)的Android应用程序和服务器之间。 如果你看过Evernote
或类似的应用程序,你肯定明白我的意思。
我有一些问题(假设我们要同步DB记录):
每个用户都有为自己的服务器空间的一部分(如Evernote
或Dropbox
)。 也许用户创建的手机新记录,并在服务器创建新记录。 我怎么能这些记录搭配在一起? 如果有与同一ID记录你建议我怎么算法?
除了JSON, 还有什么办法为手机设备和服务器之间发送数据?
如果SyncAdapter和ContentProvider的可以解决我的问题,请准确解释我。 (如果你能提供一些样品或教程,我或任何意见或关键字,以帮助拓宽/指导我的搜索,将不胜感激以及)。
我会尽力回答您的问题通过解决一个更大的问题: 我怎么能一个网络服务器和Android应用程序之间同步数据?
你的网络服务器和Android应用程序之间同步数据需要在Android设备上了几个不同的组件。
永久存储:
这是您的手机实际上是如何保存它从网络服务器接收数据。 为实现这一点的一种可能的方法是写自己的定制的ContentProvider通过SQLite数据库支持。 对于内容提供商一个体面的教程可以在这里找到: http://thinkandroid.wordpress.com/2010/01/13/writing-your-own-contentprovider/
ContentProvider的定义一致的接口与存储的数据进行交互。 它也可以让你想其他应用程序与数据进行交互。 您ContentProvider的背后可能是一个SQLite数据库,缓存,或者任意存储机制。
虽然我肯定会推荐使用ContentProvider的一个SQLite数据库,你可以使用你想要的任何基于Java存储机制。
数据交换格式:
这是你用你的网络服务器和你的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”,以确保您始终获得最新的数据,或者你不小心写了新写入的数据。
如果我们想想今天 , 公认的答案是太旧了。 因为我们知道,我们有很多新的图书馆,它可以帮助你做出这种类型的应用。
你应该学会下面的主题,将帮助你肯定:
SyncAdapter:在您的应用程序同步适配器组件封装为设备和服务器之间传输数据的任务的代码。 基于调度和触发你在你的应用程序提供,同步适配器框架运行在同步适配器组件的代码。
境界 :境界是移动数据库:SQLite的和核心数据的替代品。
改造类型安全的针对Android和Java的广场HTTP客户端,公司必须学会一个智能双向使用的,改造
而你像数据库同步逻辑: 如何在服务器同步的Android手机上的SQLite数据库MySQL数据库?
好运到所有新学员。 :)
如果你写这个自己这些都是一些要点要牢记
设备和同步服务器之间适当的认证
在设备和服务器之间的同步协议。 它通常会在3个阶段,身份认证,数据交换,状态交换(其中业务工作和失败)
选择你的负载格式。 我建议基于XML的SyncML与基于JSON格式的混合,代表实际数据。 这样的SyncML用于协议和JSON实际数据被交换。 使用JSON阵列而操纵所述数据总是优选的,因为它很容易使用JSON阵列访问数据。
跟踪的客户端和服务器上的数据变化。 可以认为,改变和同步会话期间去接他们ID的更新日志。 此外,清除更改日志文物被成功同步。 你也可以使用一个布尔变量来确认同步状态,同步也就是最后一次。 这将有利于在最后同步完成的最终用户,以确定的时间。
需要有一种方式从服务器进行通信的设备,开始同步会话服务器上的数据变化。 您可以使用C2DM或写自己的执着基于TCP通讯。 在TCP的方法是很多的无缝
一种方法来复制在多个设备上的数据变化
最后但并非最不重要的,一种方法来检测和处理冲突
希望这有助于为一个很好的起点。
@Grantismo提供整体很好的解释。 如果你想知道是谁的人实际上是在做这个事情,我建议你看一看谷歌是怎么做的2014年谷歌IO应用程序(它总是值得考虑这些应用程序,它们释放的源代码深沉的样子。有很多从那里学习)。
这里有一个关于它的博客文章: http://android-developers.blogspot.com.br/2014/09/conference-data-sync-gcm-google-io.html
从本质上讲,在应用程序端:GCM信令,同步适配器进行数据读取,并与内容提供商,这将使事情持续正常说话(是的,它从应用程序的其他部分直接进入隔离DB)。
另外,如果你想看看2015年的代码: https://github.com/google/iosched
看看parseplatform.org 。 它的开源项目。
(除了你可以去在可用的商业包装back4app.com 。)
这是一个非常简单的和用户友好的服务器端的数据库服务,给出了一个伟大的Android客户端API
例如,要同步表todoTable
从MySql
到Sqlite
首先,创建一个列名version (type INT)
在todoTable
两个Sqlite
和MySql
二,创建一个表名database_version
有一列名currentVersion(INT)
在MySql
,当你添加新项todoTable
或更新的项目,必须由+1升级这个项目的版本也升级currentVersion
在Android
,当你要同步(通过手动按下同步按钮或用一段时间服务运行):
您将发送与请求Sqlite
CURRENTVERSION(目前是1)到服务器。
然后在服务器上,你发现了什么项目在MySql
具有版本值大于Sqlite
CURRENTVERSION(1),然后响应到Android(在这个例子中,版本2的意志应对Android的第3项)
在SQLite
,你会添加或更新新项目todoTable
和升级CURRENTVERSION
一个方法来完成这有等待数据的服务器端应用程序。 数据可利用发送HttpRequest
在Java对象,或者您可以编写自己的TCP/IP
的数据传输工具。 数据可以通过发送JSON
格式,或者您认为合适的任何其他格式。 另外的数据可以发送到服务器,如果它包含敏感信息之前进行加密。 所有的服务器应用程序需要做的只是等待HttpRequests
进来和分析数据,并存储你想要的任何地方。
我会建议使用类似于二进制Web服务协议Hessian的 。 它的工作原理非常好,他们有一个机器人的实现。 这可能是一个有点沉重,但取决于你正在构建的应用程序。 希望这可以帮助。
@Grantismo给Android同步组件的很好的概述。
SyncManagerAndroid库提供一个简单的2路同步实施插到Android同步框架(AbstractThreadedSyncAdapter.OnPerformSync)。
https://github.com/sschendel/SyncManagerAndroid