同步Android应用程序和networking服务器之间的数据
我想在Android应用程序和服务器之间同步数据(如数据库logging,媒体)。 如果您已经看到Evernote
或类似的应用程序,你当然明白我的意思。
我有一些问题(想象我们想同步数据库logging):
-
每个用户都有自己的一部分服务器空间(如
Evernote
或Dropbox
)。 也许用户通过手机创build新的logging,并在服务器中创build新的logging。 我怎样才能将这些logging匹配在一起? 如果有相同的IDlogging你build议我什么algorithm? -
除了JSON , 手机设备和服务器之间有没有办法发送数据?
-
如果SyncAdapter和ContentProvider可以解决我的问题,请为我准确解释。 (如果您可以提供一些样本或教程给我或任何意见或关键字,以帮助扩大/指导我的search,也将不胜感激)。
我将尝试通过解决更大的问题来回答所有问题: 如何在Web服务器和Android应用程序之间同步数据?
在您的web服务器和android应用程序之间同步数据需要android设备上的几个不同的组件。
持久存储:
这就是您的手机实际存储从networking服务器接收到的数据的方式。 一种可能的方法是编写你自己的由Sqlite数据库支持的自定义ContentProvider 。 内容提供者一个体面的教程可以在这里find: http : //thinkandroid.wordpress.com/2010/01/13/writing-your-own-contentprovider/
ContentProvider定义了一个一致的接口来与存储的数据进行交互。 如果您愿意,也可以让其他应用程序与您的数据交互。 您的ContentProvider后面可以是Sqlite数据库,caching或任何任意存储机制。
虽然我肯定会推荐使用带有Sqlite数据库的ContentProvider ,但是您可以使用任何您想要的基于Java的存储机制。
数据交换格式:
这是你用来在你的web服务器和你的android应用程序之间发送数据的格式。 目前最stream行的两种格式是XML和JSON。 select格式时,应该考虑可用的序列化库。 我知道手头有一个名为gson的json序列化库,虽然我相信XML存在类似的库。
同步服务
您需要某种asynchronous任务,从您的服务器获取新数据,并刷新移动内容以反映服务器的内容。 每当您对内容进行本地更改并希望反映这些更改时,您还需要通知服务器。 Android提供SyncAdapter模式作为轻松解决这种模式的一种方式。 您需要注册用户帐户,然后Android会为您执行许多魔术,并允许您自动同步。 这是一个很好的教程: http : //www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/
至于如何确定logging是否相同,通常情况下,您将创build具有唯一标识的项目,并将其存储在Android设备和服务器上。 您可以使用它来确保您指的是相同的参考。 此外,您可以存储像“updated_at”这样的列属性,以确保始终获取最新的数据,或者不会意外地写入新写入的数据。
如果我们想到今天 , 接受的答案太旧了。 正如我们知道的,我们有许多新的库可以帮助您进行这种types的应用程序。
你应该学习以下主题,这将有助于你一定:
-
SyncAdapter:应用中的同步适配器组件封装了在设备和服务器之间传输数据的任务的代码。 根据您在应用中提供的调度和触发器,同步适配器框架将运行同步适配器组件中的代码。
-
RealM :Realm是一个移动数据库:SQLite&Core Data的替代品。
-
为Square和Inc. 改造适用于Android和Java的types安全的HTTP客户端必须学习一种智能方式使用改造
和您的数据库的同步逻辑,如: 如何同步Android手机上的SQLite数据库与服务器上的MySQL数据库?
祝所有新学员都好运。 🙂
如果你自己写这些,这些是要记住的一些要点
在设备和Sync Server之间进行适当的身份validation
设备和服务器之间的同步协议。 它通常分三个阶段进行authentication,数据交换,状态交换(哪些操作起作用,哪些失败)
select你的有效载荷格式 我build议基于SyncML的XML与基于JSON的格式混合来表示实际的数据。 所以SyncML的协议和JSON的交换实际数据。 总是首选使用JSON数组,因为使用JSON数组很容易访问数据。
跟踪客户端和服务器上的数据更改。 您可以维护在同步会话期间更改并更新的id的更新日志。 另外,清除更新日志,因为对象已成功同步。 您也可以使用布尔variables来确认同步状态,即上次同步。 最终用户可以识别上次同步完成的时间。
当服务器上的数据发生变化时,需要有一种从服务器到设备的通信方式来启动同步会话。 您可以使用C2DM或编写您自己的持久性基于TCP的通信。 tcp的方法是很多的无缝
一种在多个设备上复制数据更改的方法
最后但并非最不重要的一种检测和处理冲突的方法
希望这有助于作为一个好的起点。
@Grantismo总体上提供了一个很好的解释。 如果你想知道谁在做这些事情,我build议你看一看Google为2014年的Google IO App做了些什么(总是值得深入了解他们发布的这些应用程序的源代码。从那里学到很多东西)。
以下是关于它的博客文章: http : //android-developers.blogspot.com.br/2014/09/conference-data-sync-gcm-google-io.html
本质上,在应用程序方面:用于信号传输的GCM,用于数据提取的Sync适配器以及与Content Provider正确对话,这将使事物保持持久性(是的,它将数据库与应用程序的其他部分直接访问隔离)。
另外,如果您想查看2015年的代码: https : //github.com/google/iosched
我可以build议你Cloudant。 是一个具有完全同步支持的数据库即服务。
他们有一个免费的阶层。
看看parseplatform.org 。 这是开源项目。
(以及你可以去back4app.com商业包)。
这是一个非常直接和用户友好的服务器端数据库服务,给出了一个伟大的Android客户端API
一个方法来完成这个有一个服务器端应用程序,等待数据。 可以使用Java中的HttpRequest
对象发送数据,也可以编写自己的TCP/IP
数据传输实用程序。 数据可以使用JSON
格式或您认为合适的任何其他格式发送。 同样,如果数据包含敏感信息,则可以在发送到服务器之前encryption数据 所有服务器应用程序所要做的就是等待HttpRequests
进入并parsing数据并将其存储在任何你想要的地方。
例如,您想要将表todoTable
从MySql
同步到Sqlite
首先,在todoTable
为Sqlite
和MySql
创build一个列名version (type INT)
其次,创build一个名为database_version
的表名,其中一列名为currentVersion(INT)
在MySql中,当您将新项目添加到todoTable
或更新项目时,必须将此项目的版本升级+1, 同时升级currentVersion
在Android中,当您想要同步时(通过手动按同步button或服务运行时间段):
你将发送请求与Sqlite currentVersion(目前是1)到服务器。
然后在服务器中,你会发现MySql
哪个项目的版本值大于Sqlite
currentVersion(1),然后响应Android(在这个例子中,第2版的第3项将响应Android)
在SQLite中,您将添加或更新新项目到todoTable
并升级currentVersion
我会build议使用类似于Hessian的二进制web服务协议。 它工作得很好,他们有一个android实现。 这可能有点沉重,但取决于你正在build立的应用程序。 希望这可以帮助。
为什么不使用Google云消息传递? 这里是链接: http : //developer.android.com/google/gcm/index.html
@Grantismo给出了Android同步组件的很好的概述。
SyncManagerAndroid库提供了一个简单的双向同步实现来插入Android Sync框架(AbstractThreadedSyncAdapter.OnPerformSync)。