我想在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).


当前回答

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

其他回答

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


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

持久性存储:

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

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

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

数据交换格式:

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

同步服务

You'll want some sort of asynchronous task which can get new data from your server and refresh the mobile content to reflect the content of the server. You'll also want to notify the server whenever you make local changes to content and want to reflect those changes. Android provides the SyncAdapter pattern as a way to easily solve this pattern. You'll need to register user accounts, and then Android will perform lots of magic for you, and allow you to automatically sync. Here's a good tutorial: http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/


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

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

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

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

https://github.com/sschendel/SyncManagerAndroid

例如,您想要将表todoTable从MySql同步到Sqlite

首先,在todoTable中为Sqlite和MySql创建一个列名版本(类型INT)

其次,创建一个名为database_version的表,其中一个列名为currentVersion(INT)

在MySql中,当您向todoTable或update item中添加新项时,必须将该项的版本升级+1,同时升级currentVersion

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

您将发送请求与Sqlite的currentVersion(目前是1)到服务器。 然后在服务器中,你发现MySql中有什么项目的版本值大于Sqlite currentVersion(1),然后响应Android(在这个例子中,项目3与版本2将响应Android)

在SQLite中,您将向todoTable添加或更新新项,并升级currentVersion

看看parseplatform.org。 这是一个开源项目。

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

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