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

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

  • 首次安装(或应请求)应用程序时,所有内容的初始下载

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

  • 应偶尔判断在线数据库是否有新的在线条目,并将其下载到本地数据库.

在实现这一点上,我有很多问题.

第一个就是how to do it.我认为这涉及到内容提供者和同步提供者,但我不确定具体如何.我是否需要在contentProvider中复制我的SQLite数据库,或者我在底层设计中犯了一个错误,直接使用数据库,而不是通过自定义内容提供者使用数据库?

其次,位置记录不能简单地从在线数据库上下复制,因为它们将具有冲突的ID号.我有几个关系表,比如将tag-id与location-id关联起来的"tag".我的Tag-ID不一定与另一个用户的Tag-ID匹配.位置ID也是如此.因此,在转移过程中需要一些逻辑.Where / how should this be properly handled?这就是内容解析者的角色吗?(不确定那到底是什么)

第三,如果两个用户同时添加相同的位置(可能具有不同的描述和详细信息),会发生什么情况?Is there a best-practice for merging这些记录?

最后,这部分对我来说是全新的.我可以把主数据库放在一个公共dropbox文件夹中,还是需要从头开始构建一个定制的php web应用程序?或者是否有一个预打包的解决方案可以让这部分变得更容易?

推荐答案

你绝对应该使用ContentProviderSyncAdapters.你应该:

  • ContentProvider接口包装您的数据库功能
  • 设置与ContentProvider的权限匹配的SyncService
  • 在你的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进行DB操作.ContentProviders提供了从应用程序和同步适配器访问数据的统一方式.他们将通知系统更新,以便框架和时间表同步.如果你 Select 这样做,它们也可以作为你的数据到其他应用程序的公共接口.

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

最后

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

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

这两款应用都使用Google App engine作为云组件.它很容易上手,所以一定要探索那些选项.

Database相关问答推荐

Power BI中的计数

撤销语句释放类实例中可用的缓冲区

文件存储的推荐位置 - 在数据库或其他什么地方?

使用自动递增主键将 csv 导入 sqlite

将光标中找到的值输出到logcat?

何时将数据库称为嵌入式数据库?

SQL 概念 LEFT OUTER JOIN 和 WHERE NOT EXISTS 基本相同吗?

数据库中空值(nulls)使用的空间

在一次 SQL 查询中更新多行的多列

行之间的 SQL 差异

数据库表中的索引有什么缺点?

如何通过 PHP 和 Linux 使用 pdo 连接到 mssql?

寻找示例数据库设计的好方法

我如何做大于/小于使用 MongoDB?

数据库与微服务的一致性

sqlite 表中的最大行数

分离实体和被管理实体

以可能的数据丢失为代价提高 PostgreSQL 写入速度?

带数据库的Electron 应用程序

从 SQLAlchemy 中的文件执行 SQL