【问题标题】:Sync data between Android App and webserver [closed]在Android App和网络服务器之间同步数据[关闭]
【发布时间】:2012-06-05 11:03:20
【问题描述】:

我想在 Android 应用程序和服务器之间同步数据(例如数据库记录、媒体)。如果您看过Evernote 或类似的应用程序,您肯定明白我的意思。

我有一些问题(假设我们要同步数据库记录):

  1. 每个用户都有自己的一部分服务器空间(例如EvernoteDropbox)。也许用户通过手机创建新记录并在服务器中创建新记录。 如何将这些记录匹配在一起?如果有相同 ID 的记录您建议我使用什么算法?

  2. 除了JSON手机设备和服务器之间有什么方法可以发送数据吗?

  3. 如果 SyncAdapterContentProvider 可以解决我的问题,请为我解释清楚。 (如果您可以向我提供一些示例或教程,或者任何有助于扩大/指导我的搜索的建议或关键字,我们将不胜感激。

【问题讨论】:

  • 首先,您需要弄清楚(决定)您与服务器的通信协议 - 因此 - 您可以传输哪些数据以及如何传输。
  • 这对我来说很重要,传输 SQLlite 数据。但我会知道如何传输其他数据。我不明白你对协议的意思。请进一步解释。
  • 试试 konysync,konylabs 的产品,它提供跨各种平台(android、windows、ios)、webservers、数据提供者(salesforce、sap 提供者)、数据库(sqlserver、mysql)的端到端解决方案...)

标签: android android-syncadapter data-sharing


【解决方案1】:

如果我们考虑今天accepted answer 太老了。我们知道我们有许多新的库可以帮助您制作这种类型的应用程序。

您应该学习以下对您肯定有帮助的主题:

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

  • Realm:Realm 是一个移动数据库:SQLite 和 Core Data 的替代品。

  • Retrofit Square, Inc. 的适用于 Android 和 Java 的类型安全 HTTP 客户端。必学 a-smart-way-to-use-retrofit

您的数据库同步逻辑如:How to sync SQLite database on Android phone with MySQL database on server?

祝所有新学习者好运。 :)

【讨论】:

【解决方案2】:

例如,您要将表 todoTableMySql 同步到 Sqlite

首先,在todoTable 中为SqliteMySql 创建一个列名version (type INT)

其次,用一个列名currentVersion(INT)创建一个表名database_version

MySql中,当您向todoTable添加新项目或更新项目时,您必须将该项目的版本升级+1并且升级currentVersion

Android,当你想同步时(通过手动按下同步按钮或​​运行一个带时间段的服务):

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

SQLite 中,您将向todoTable 添加或更新新项目并升级当前版本

【讨论】:

  • 您的想法很棒,但仍然无法正确理解餐桌设计。它与休息服务和适当的同步服务一起工作
【解决方案3】:

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

(您也可以通过back4app.com 购买商业套餐。)

这是一个非常直接且用户友好的服务器端数据库服务,提供了一个很棒的 android 客户端 API

【讨论】:

  • 提供哪些免费计划?
  • http://parse.com/ 已关闭。
  • 你仍然可以使用 parse.com 的功能,但是在你自己的服务器上,它们已经开源了
【解决方案4】:

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


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

持久存储:

这就是您的手机实际存储从网络服务器接收到的数据的方式。实现此目的的一种可能方法是编写由 Sqlite 数据库支持的自定义 ContentProvider。可以在这里找到内容提供商的体面教程:http://thinkandroid.wordpress.com/2010/01/13/writing-your-own-contentprovider/

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

虽然我当然会推荐使用带有 Sqlite 数据库的 ContentProvider,但您可以使用任何您想要的基于 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 -> “执行很多魔术”。我希望你把它称为黑魔法……这完全是邪恶的。
  • @MRodrigues : SyncAdapter 对开发人员来说可能是黑魔法,但它仍然对稳定性和功能有魔力,它比其他库要好得多
  • 网络服务本身需要什么才能与安卓设备同步? Spring可以吗?
【解决方案5】:

@Grantismo 对整体提供了很好的解释。如果您想知道实际上是哪些人在做这些事情,我建议您看看 google 为 2014 年的 Google IO 应用程序所做的事情(始终值得深入了解他们发布的这些应用程序的源代码。有可以从中学到很多东西)。

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

从本质上讲,在应用程序方面:GCM 用于发送信号,Sync Adapter 用于获取数据并与 Content Provider 正确通信,这将使事情持久化(是的,它将数据库与应用程序其他部分的直接访问隔离开来)。

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

【讨论】:

  • Google IO 应用程序的源代码非常有用 IMO!
【解决方案6】:

@Grantismo 很好地概述了 Android 同步组件。

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

https://github.com/sschendel/SyncManagerAndroid

【讨论】:

    【解决方案7】:

    如果您自己编写,请记住以下几点

    设备和同步服务器之间的正确身份验证

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

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

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

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

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

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

    希望这是一个好的起点。

    【讨论】:

      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

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

        【讨论】:

        • 如何查看本地App和服务器更新的数据?以及如何合并在一起?我将所有记录通过 JSON 或任何东西发送到应用程序以合并它们是不好的。你怎么看?
        • 您可以使用一个标志,例如“在服务器上”,用 int/bool 1/0 表示是或否。当发送记录/文件/数据块时,检查服务器是否成功,并将该位翻转为是。那么如果你使用 SQLite 之类的东西,你可以做一个“SELECT * FROM my_table WHERE sent = 0”类型的东西来发送任何新记录
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-19
        • 2018-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-05
        相关资源
        最近更新 更多