我正在创建一个记录数据的应用程序。我正在创建具有数据的文档,然后将这些文档发送到沙发式服务器。或者我还是想尝试。我主要关心的是如何确认文档存储在服务器上,以便可以在设备上立即将其删除?我希望有一种快速有效的方法来做到这一点。最终结果是让一个线程不断检查是否有与Couchbase的连接,如果有,则开始发送数据以清除设备中的数据。大多数文档似乎都是关于同步数据库的,但是我不想这样做,因为我不想在设备上保留数据的副本。它将占用过多的存储空间。谢谢你的帮助。
编辑:为澄清起见,我目前拥有在文档中存储许多数据点的应用程序。我想将这些文档发送到一个长沙发服务器。我不想“同步”文档,而只是将它们插入数据库,然后立即将其从设备中删除。人们将如何去做呢?我见过的大多数示例通常都同步文档,例如配置文件信息,其中可以在各种同步的数据库中进行更改,所有这些更改都将出现在每个数据库中。相反,我希望与数据库建立一种单向关系,即信息被发送,确认已接收,然后立即从设备中删除。
答案 0 :(得分:2)
至少有几种可能性。
如果您期望稳定的网络连接,或者自己可以处理错误,则可以通过直接REST调用Sync Gateway来实现。当然,您始终可以编写自己的REST服务器,该服务器也可以直接与Couchbase Server通信。
第二种方法依赖于较旧版本的Couchbase Lite。 Couchbase Lite 2.x是产品的主要重写。从当前的发行版本(2.1)开始,它不支持此方法,因此您需要使用1.x版本(1.3或更高版本,IIRC)。进一步了解如何使用2.1处理此问题。
设置仅推送复制。复制后,循环浏览文档并清除所有尚未挂起的文档。 (这使用isDocumentPending
类上的Replication
方法。这是从2.1开始不可用的关键部分。)您可以运行一次快照复制,并在复制完成后执行此操作,或者监视复制状态连续复制。
从本地CB Lite数据库中清除文档可以有效地使其工作,就好像该设备上不存在该文档一样。通过运行仅推送复制,您不必担心文档会被发送回设备。
使用2.1,您无法轻松确定文档是否已被复制。因此,您需要运行复制才能完成操作,同时还要通过编写新内容来避免竞争情况。
这里的一种方法是暂停编写文档,一次复制,然后清除文档,然后再次启动。您还可以使用备用数据库解决问题,或者以某种方式自己跟踪文档,等等。
为了完整起见,如果您遇到多种用途的情况,也就是说,只希望将某些文档从设备上推下并忘却,而有些则进行了同步,则可以通过Sync Gateway通道进行控制。
答案 1 :(得分:1)
我不太了解Lite和Sync Gateway,但是从服务器角度来看:
您可以在Couchbase中使用新的Eventing服务。在存储桶A中创建文档后,您可以编写一个事件将该文档复制到存储桶B中。然后,如果在设备上删除了文档,则从存储桶A中删除它们也没关系。
我有一个存储区“ staging”和一个存储区“ final”。我用“ final”创建了一个名为“ moveIt”的函数(我别名为“ f”)。
OnUpdate函数可以很简单:
function OnUpdate(doc, meta) {
f[meta.id] = doc;
}
我主要关心的是时间。我认为您决定在Lite中删除该文件并开始同步之前,您的移动应用没有一种简单的方法可以知道该事件已完成文档的复制。但这可能值得一试。签出文档到learn more about the Eventing service details。
答案 2 :(得分:1)
在Couchbase Lite 2.5中,您可以使用replicated events来检测文档何时同步(推送到服务器或从服务器拉出)。您可以在Couchbase Lite复制器上注册一个回调,以检测文档是否已推送到同步网关,然后使用purge API进行本地清除