【问题标题】:PouchDB: Clear localDB when it is safe on remoteDBPouchDB:在 remoteDB 上安全时清除 localDB
【发布时间】:2017-01-13 22:34:41
【问题描述】:

上下文

我使用 PouchDB,并且有一个使用 indexedDb 的 localDB。我用这个函数不断地把这个本地数据库复制到一个远程数据库(CouchDB):

function replLocalToRemote() {
    this.meta.localDB.replicate.to(this.meta.remoteDB, {
      // Live: replication occurs as the changes are detected
    live: true,
    retry: true,
    }).on('paused', function (info) {
      console.log('paused', info);
      // replication was paused, usually because of a lost connection
    }).on('change', function (change) {
      console.log('change', change);
      // yo, something changed!
    }).on('active', function (info) {
      console.log('active', info);
      // replication was resumed
    }).on('error', function (err) {
      alert('replication failed. Retry... ', err);
      // totally unhandled error (shouldn't happen)
    });
  }

它运行良好,但是当设备上的数据过多时会出现问题。尤其是在 IOS 上,Safari 会不断打开弹出窗口以要求更多数据存储(从 5Mo 开始)。

问题

所以我想在将 localDB 复制到 remoteDB 时清理它。例如,一旦远程文件在本地就删除它并继续复制,即使远程数据多于本地数据。

这可能吗?

【问题讨论】:

  • 不是您问题的真正答案,但您可以通过使用 SQLite 数据库而不是 IndexedDB 和 WebSQL 来避免弹出窗口和存储短缺问题。请参阅 Cordova/PhoneGap 的 SQLite 插件 部分 here
  • @Phonolog 很有趣,但我的应用不是 Cordova/PhoneGap 应用。
  • 嗯,另一个想法:一旦数据库中的数据过多(或者假设每天/每周/每月)删除数据库并创建一个新数据库。将新的复制到您的远程数据库...

标签: javascript couchdb pouchdb


【解决方案1】:

删除本地文档会给您带来麻烦,因为删除操作会复制到远程数据库,因此您会完全丢失文档。

您见过 PouchDb 中的“自动压缩”功能吗?这通过删除任何“非叶子”修订文档(以前的版本)来最小化本地数据库的大小。

您可以像这样启用此功能:

var db = new PouchDB('mydb', {auto_compaction: true});

更多信息请访问the PouchDb page

【讨论】:

  • 感谢您的回答,但数据库大小不是由于修订,而是由于不同的文档。所以压缩不会真正减小大小。
【解决方案2】:

您可以尝试不时(例如每天)创建一个新的本地数据库,并从那里开始新的复制。只要旧 dbs 仍在复制,就保留它们,并在它们完全复制后立即删除它们。

为了不丢失任何数据,您应该特别注意在删除数据库之前所有数据都已复制到服务器。

【讨论】:

  • 问题是每次创建新的本地数据库时都需要复制到新的远程数据库。远程数据库结构将很难保持清洁。
  • 不完全是。您可以轻松地复制到同一个远程数据库。如果您能详细说明您的特殊用例,我可以为您提供更多帮助。
猜你喜欢
  • 2020-01-16
  • 2017-04-29
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 2016-09-09
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多