Android在用户之间同步数据

Android在用户之间同步数据,android,database,synchronization,cloud,android-contentprovider,Android,Database,Synchronization,Cloud,Android Contentprovider,我有一个android应用程序,可以维护不同地理位置的本地SQLite数据库 现在,我想将该数据库连接到“云”,以完成以下任务: 首次安装应用程序时(或根据要求)首次下载所有内容 本地添加的新位置应上传到云(自动) 应偶尔检查在线数据库中的新在线条目,并将其下载到本地数据库中 我在完成这项工作时遇到了很多问题 第一个问题就是如何做。我认为这涉及到内容提供者和同步提供者,但我不确定如何进行。我是否需要在contentProvider中复制我的SQLite数据库,或者我在底层设计中犯了一个错误,

我有一个android应用程序,可以维护不同地理位置的本地SQLite数据库

现在,我想将该数据库连接到“云”,以完成以下任务:

  • 首次安装应用程序时(或根据要求)首次下载所有内容

  • 本地添加的新位置应上传到云(自动)

  • 应偶尔检查在线数据库中的新在线条目,并将其下载到本地数据库中

我在完成这项工作时遇到了很多问题

第一个问题就是如何做。我认为这涉及到内容提供者和同步提供者,但我不确定如何进行。我是否需要在contentProvider中复制我的SQLite数据库,或者我在底层设计中犯了一个错误,直接使用数据库,而不是通过自定义内容提供程序

其次,位置记录不能简单地从在线数据库上下复制,因为它们的ID号相互冲突。我有几个关系表,例如“tags”,它们将标记id与location-id关联起来。我的标记id不一定与其他用户的标记id匹配。与位置ID相同。因此,在转移过程中需要一些逻辑应在何处/如何正确处理此问题?这是contentResolver的角色吗?(不确定那到底是什么)

第三,如果两个用户同时添加相同的位置(可能具有不同的描述和细节),会发生什么情况是否有合并这些记录的最佳做法


最后,构建/托管在线组件的最简单方法是什么?这部分对我来说是全新的。我可以将主数据库放在公共dropbox文件夹中,还是需要从头构建一个定制的php web应用程序?或者是否有一个预打包的解决方案可以使这一部分变得更简单?

您肯定应该使用
ContentProvider
SyncAdapters
。你应该:

  • 使用
    ContentProvider
    界面包装数据库功能
  • 设置与
    ContentProvider的权限匹配的
    SyncService
  • 在您的
    SyncAdapter
    专用化中,您将覆盖
    onPerformSync()
  • 使用
    SharedReferences
    存储来跟踪同步参数,例如上次同步时间等

    final SharedPreferences syncMeta =
                        mContext.getSharedPreferences("sync:" + account.name, 0);
    long lastSyncTime = syncMeta.getLong(LAST_SYNC, 0);
    long lastServerSyncTime = syncMeta.getLong(SERVER_LAST_SYNC, 0);
    
  • 这可以很容易地告诉您这是第一次同步,您可以在这里进行初始处理

  • 您将在此处编写同步算法,即单向/双向
  • 我发现在Android记录中记录时间戳和服务器数据库ID有助于同步。这可以帮助您制定合并策略
  • 在这里使用ContentProvider进行DB操作。ContentProviders提供了从应用程序以及同步适配器访问数据的统一方式。他们将通知系统更新,以便框架和计划同步。如果您选择这样做,它们还可以作为您的数据到其他应用程序的公共接口

  • 此外,使用SyncService可以节省电池电量。如果将所有应用程序的同步操作批处理在一起,而不是每个应用程序唤醒系统,系统将使用网络提示来启动同步操作,并达到最佳效果

最后,

你应该看两个样品。它们几乎涵盖了我解释的所有内容

  • 跳票-
  • 样本syncadapter-

  • 这两个应用程序都使用Google App Engine作为云组件。这很容易开始,所以一定要探索这些选项。

    首先在android中创建一个本地数据库。和您的保存位置详细信息。保存后发送到云/服务器数据库

    接下来,您需要同步哪个云/服务器数据库。因此,在android中编写一个服务,比如使用特定的时间间隔并与clound/server DB同步


    合并,所以在表中设置一个时间戳。并检查时间戳并相应更新。

    谢谢您提供的示例。你知道有任何在线教程涵盖这一点吗?(代码很好,但需要一段时间才能看完),而developer.android.com页面上的内容也不多。第2部分更相关。该教程使用自定义帐户。你可以依赖com.google账户。我知道这个问题是3年前提出的,并且有一个公认的答案。你能详细说明一下你还需要什么样的赏金信息吗?