将2个远程数据库复制到单个PouchDB数据库以获得Android 1数据库限制

时间:2017-09-15 14:53:16

标签: android sqlite ionic2 couchdb pouchdb

我有一个离子3 PouchDB应用程序适用于某些Android设备(例如4.4和5.0)但不能用于其他设备(例如7.0.1)。它适用于所有iPhone!我怀疑这是因为某些Android版本将Webview数据库的数量限制为每个应用程序一个。

我已经读过,可以通过使用SQLite来解决这个问题,但是SQLite要慢得多,而且对于包含图像的DB文档(我有),速度特别慢。所以我想看看将我的两个CouchDB数据库复制到一个PouchDB数据库。

我有几个问题:

  1. 有什么理由说这不能解决Android数据库限制?我将为我的两个远程数据库(称为“新闻”和“事件”)提供localDB.replicate.from(remoteDB)
  2. 目前,我的每个CouchDB数据库都有2017年第一个月和最后一个月的ID为2017-12017-12的文档。如果我将两个数据库复制到一个PouchDB,他们必须有唯一的ID?如果不是,我将如何区分?

1 个答案:

答案 0 :(得分:1)

  1. 是的,您可以根据需要将任意数量的dbs复制到数据库中,但是当复制到一个数据库中时,具有相同ID的文档应该变为"eventual conflicts",因此一个文档将丢失并且只能在通过明确请求冲突来合并数据库。

  2. 使用非随机ID时,您应至少更新一个dbs以使用唯一的命名空间,例如Event-2017-01。如果要使用仍然分离的远程dbs实现双向复制,这还将简化您需要的复制过滤器。

  3. 我通常会在文档的附件中添加一个带有前缀的单独文档,即attachment-[orig_id],以便可以从复制中过滤媒体。您可能需要考虑以这种方式解析附件(对于至少一个dbs),以便您可以在一个"媒体"中混合所有附件。 db具有给定客户端的理想适配器,并使用其他适配器来处理普通文档。

    例如,你可能有:

      mdb = new Pouchdb('media', {adapter:'idb'}).
          replicate.from('http...news', {filter:'_view', view:'mediadocs'}).
          replicate.from('http...events', ...filter...);
      news = new Pouchdb('news', {adapter:'websql'}).
          replicate.from('http...news', {filter:'_view', view:'normaldocs'});
      events = new Pouchdb('events', {adapter:'websql'}).
          replicate.from('http...events', {filter:'_view', view:'normaldocs'});
    

    如果带有媒体的字段被拆分为另一个基于原始文档的文档,那么您还没有冗余副本..但是,您可以构建从新闻和事件中提供的临时dbs:

    today = new Pouchdb('today', {adapter:'memory'}).
          replicate.from(news, {selector ..dayview..}).
          replicate.from(events, ...selector...);
    

    临时数据库使用相对较少的资源,但其文档充当相应媒体数据库文档的索引。