27

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

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

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

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

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

我在完成这个过程中遇到了很多问题。

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

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

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

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

4

2 回答 2

22

你绝对应该使用ContentProviderand SyncAdapters。你应该:

  • 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,您可以节省电池电量。系统将使用网络 Tickles 来启动同步操作,如果它们为所有应用程序一起批处理而不是每个应用程序唤醒系统,则最好

最后,

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

  1. JumpNote - http://code.google.com/p/jumpnote/source/browse/
  2. SampleSyncAdapter - http://developer.android.com/resources/samples/SampleSyncAdapter/index.html

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

于 2012-05-02T14:36:13.537 回答
-1

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

接下来偶尔你需要同步哪个云/服务器数据库。所以在 android 中编写一个服务,比如采取特定的时间间隔并与 clound/server DB 同步。

合并所以在表中取一个时间戳。并检查该时间戳并相应更新。

于 2012-05-02T14:40:38.437 回答