2013-01-18 64 views
13

这更多的是不一定与任何特定技术绑定的概念问题。 假设你在服务器上获得了一些数据库,一些REST/JSON API访问该数据库中的内容,一些移动客户端显示通过API检索到的数据。将部分数据库模型从服务器同步到客户端

在客户端上有一些缓存机制,并且只要客户端只能读取数据就能够离线访问数据会很好(在我的情况下,拒绝对脱机客户端的写入访问权限避免必须管理所有可能发生的讨厌冲突)。

看来,解决这个问题的好方法是在客户端上提供服务器数据库模型的子集,并将数据从服务器同步到客户端。 访问本地数据库可能会立即返回结果,但也触发更新请求到服务器。如果服务器返回修改后的数据,则客户端模型会同步其本地数据库并通知显示数据更改。

最终的目标当然是用户可以浏览信息,不管他的互联网连接的稳定性如何,只要他不修改任何数据就不会受到连接对话框或类似的问题的困扰。

从实现的角度来看......一方面,将服务器数据库直接连接到客户端数据库似乎不是个好主意,因为它们可能来自不同的供应商。我想至少在两个数据库实现上都需要一个独立于供应商的模型。另一方面,将服务器数据库中的数据转换为某种传输格式,并将其放回到客户端数据库中似乎有很多开销。

任何建议如何以优雅和可维护的方式解决?

回答

10

我正在研究一个将大型数据库的小部分本地同步到手机上的应用程序。在手机上必须发生初始预载,但在此之后,更新会在后台异步发生。

首先,强烈建议使用JSON或XML将服务器和手机解耦。无论平台如何,锁定一种技术都会导致问题,因为您不得不使用相同的技术。也就是说,如果你打算扩展到其他平台(Web,iOS等),你不得不使用服务器规定的格式。从长远来看,选择一种通用格式将会更简单。实际上,随着公共图书馆阅读/书写JSON的数量是一件微不足道的事情。

有两种方法可以用来同步数据;

1 AlarmManager

我们安排AlarmManager触发业务唤醒上定期(可以说每6小时)。唤醒启动后台服务,联系服务器,以JSON格式下载更改并更新本地SQLite数据库。如果没有连接,则跳过该更新并安排下次唤醒。我们添加一个ConnectivityChanged接收器以在连接恢复时自动重新启动同步。

2. GCM

这是多一点的工作,但节省了大量的电池和数据使用的,如果你只在有更改更新本地数据库。 Google Cloud Messaging可以向设备发送唤醒消息,并通知它启动同步服务。同步服务的运行方式与上面的AlarmManager方法相同。

根据您需要数据的“新鲜度”以及其更改频率,我们将上述两种方法结合使用。像RSS源一样,应该每30分钟更新一次,而天气数据可能不需要每4小时更新一次。

所以要运行我们使用的数据库同步;

接收器 - >监听系统事件并触发服务 服务 - >连接到服务器,下载JSON和更新SQLite的供应商 提供商 - >插入记录到数据库中,广播ContentObservers ContentObservers含量的变化 - >当应用程序运行时,ContentObservers使用新数据更新UI

上述每个组件都有大量的技术细节,但它应该为您提供一个非常健壮的体系结构,用于将服务器数据与本地D b。

+0

我强烈建议John上面介绍的2个选项之一。由于Android内置的方式,GCM是首选。但是,如果您的项目需求不能满足GCM路线,那么第一个选项仍然存在。 –

+0

我不喜欢第一个选项,因为这可能会导致更新用户可能永远不会看到的数据。 GCM我打算包含轻量级通知,但通过它触发数据库更新可能对我来说太浪费了。另外我不确定它在手机平台上的工作效果如何,因为这些推送服务似乎与供应商相关。你对第三种选择有什么看法?根据使用情况更新本地数据库。在本地访问数据时,本地结果可能会立即返回,但也会向服务器发送相同数据的请求 – mibollma

5

我正在研究一个具有类似要求的项目。我们希望在某个服务器上有一个可用的大型数据库,然后是从其获取数据的移动设备。如果设备脱机则可以,因为它们已经在本地保存了自己的数据副本。

我们决定使用BigCouch(支持集群的Apache CouchDb的分支)作为服务器技术,然后在移动设备上使用Couchbase Mobile。 (注意TouchDB for Android将取代Couchbase Mobile,但它还不稳定。)

我们与Couch *技术一起使用的原因是Couch通过HTTP具有良好的复制。您可以通过编程方式在移动设备上启动同步事件,并会为您复制所有插入,更新和删除。它将信息存储在移动设备上自己的嵌入式CouchDb中,因此可以脱机阅读。

如果你不想走下沙发之路,你可以简单地使用SQLlite之类的东西来存储你的REST/API调用的结果。然后,当移动设备脱机并返回时,您必须编写自己的复制逻辑。有创造性的方式来做到这一点,所以也许这是一个选择。

+0

作者Couchbase Mobile是指github上的Android-Couchbase和TouchDB,你的意思是TouchDB-Android在github上?只是想知道,因为他们两人都没有在一段时间内工作,这让我想知道他们中的任何一个在某个时候是否适合生产环境。 – mibollma

+1

是的。这两个都是我的意思。你说得对,这两个项目都已经死了。事实上Couchbase Mobile已经正式死亡。 TouchDB是iOS版本的一个端口(它非常稳定并且工作很多),但它并不完整。对于Android,我们暂时与Couchbase Mobile联系。代码已经死了,但是它可以工作。我们希望Couch的人现在有时间专注于Touchbase端口,因为Couchbase 2.0已经发布。这实际上是一种计算风险,所以我们不必从头开始编写复制。 – ryan1234