Android在用户之间同步数据

时间:2012-05-02 14:11:01

标签: android database synchronization cloud android-contentprovider

我有一个Android应用程序,它维护一个不同地理位置的本地SQLite数据库。

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

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

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

  • 应偶尔检查在线数据库是否有新的在线条目,并下载到本地数据库。

我在实现这个方面遇到了很多问题。

第一个是如何做。我认为它涉及contentProviders和syncProviders,但我不确定如何。我是否需要在contentProvider中复制我的SQLite数据库,或者我是否在底层设计中错误地使用数据库而不是通过自定义内容提供程序?

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

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

最后,构建/托管在线组件的最简单方法是什么?这部分对我来说都是新手。我可以将master数据库放在公共Dropbox文件夹中,还是需要从头开始构建自定义php web-app?或者是否有预先打包的解决方案可以使这部分更容易?

2 个答案:

答案 0 :(得分:22)

您绝对应该使用ContentProviderSyncAdapters。你应该:

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

    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进行数据库操作。 ContentProviders提供了一种从应用程序和同步适配器访问数据的统一方式。他们将通知系统更新,以便框架和计划同步。如果您选择这样做,它们也可以作为您的数据与其他应用程序的公共接口。

  • 此外,通过使用SyncService,您可以节省电池电量。系统将使用网络勾选来实现同步操作,如果它们针对所有应用程序进行批处理,而不是每个应用程序唤醒系统,则会使用它最佳

最后,

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

  1. JumpNote - http://code.google.com/p/jumpnote/source/browse/
  2. SampleSyncAdapter - http://developer.android.com/resources/samples/SampleSyncAdapter/index.html
  3. 这两个应用都使用Google App Engine作为云组件。它很容易上手,所以一定要探索这些选择。

答案 1 :(得分:-1)

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

接下来,您需要同步哪个云/服务器数据库。所以在android中写一个服务就像采取特定的间隔并与clound / server DB同步。

合并所以在表格中加上时间戳。并检查该时间戳并相应更新。