将 2 个远程数据库复制到单个 PouchDB 数据库以绕过 Android 1 个数据库限制
Replicating 2 remote DBs to a single PouchDB DB to get round Android 1 DB restriction
我有一个 ionic 3 PouchDB 应用程序,可以在某些 Android 设备(例如 4.4 和 5.0)上运行,但不能在其他设备(例如 7.0.1)上运行。它适用于所有 iPhone!我怀疑这是由于某些 Android 版本将 Webview 数据库的数量限制为每个应用程序一个。
我读到有人可以通过使用 SQLite 来解决这个问题,但是 SQLite 速度要慢得多,对于包含图像的数据库文档(我有)来说尤其慢。所以我想看看将我的两个 CouchDB 数据库复制到一个 PouchDB 数据库。
我有几个问题:
- 为什么这不能绕过 Android 数据库限制?我的两个远程数据库(称为 'news' 和 'events')各有一个
localDB.replicate.from(remoteDB)
。
- 目前,我的每个 CouchDB 数据库都有 ID 如下的文档:
2017-1
和 2017-12
,用于 2017 年的第一个月和最后一个月。如果我将这两个数据库复制到一个 PouchDB 中,它们会必须有唯一的ID?如果不是,我将如何区分?
是的,你可以将任意多个数据库复制到一个数据库中,但是具有相同id的文档在复制到一个数据库中时应该变成"eventual conflicts",所以一个文档会丢失并且仅通过显式请求冲突在合并的数据库中可见。
使用非随机 ID 时,您应该至少更新一个数据库以使用唯一的命名空间,例如 Event-2017-01
。如果您想使用仍然分离的远程数据库实现双向复制,这也将简化您需要的复制过滤器。
我通常给文档的附件一个单独的文档,它有前缀,即:attachment-[orig_id]
这样媒体就可以从复制中过滤掉。您可能需要考虑以这种方式(至少一个数据库)解析附件,这样您就可以在一个 "media" 数据库中将所有附件与给定客户端的理想适配器混合使用,并使用其他适配器进行正常文档。
例如,您可能有:
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'});
如果基于原始文档将带有媒体的字段拆分到另一个文档中,那么您还没有冗余副本。但是您可以构建从新闻和事件中获取的临时数据库:
today = new Pouchdb('today', {adapter:'memory'}).
replicate.from(news, {selector ..dayview..}).
replicate.from(events, ...selector...);
其中临时数据库使用的资源相对较少,但它们的文档用作相应媒体数据库文档的索引。
我有一个 ionic 3 PouchDB 应用程序,可以在某些 Android 设备(例如 4.4 和 5.0)上运行,但不能在其他设备(例如 7.0.1)上运行。它适用于所有 iPhone!我怀疑这是由于某些 Android 版本将 Webview 数据库的数量限制为每个应用程序一个。
我读到有人可以通过使用 SQLite 来解决这个问题,但是 SQLite 速度要慢得多,对于包含图像的数据库文档(我有)来说尤其慢。所以我想看看将我的两个 CouchDB 数据库复制到一个 PouchDB 数据库。
我有几个问题:
- 为什么这不能绕过 Android 数据库限制?我的两个远程数据库(称为 'news' 和 'events')各有一个
localDB.replicate.from(remoteDB)
。 - 目前,我的每个 CouchDB 数据库都有 ID 如下的文档:
2017-1
和2017-12
,用于 2017 年的第一个月和最后一个月。如果我将这两个数据库复制到一个 PouchDB 中,它们会必须有唯一的ID?如果不是,我将如何区分?
是的,你可以将任意多个数据库复制到一个数据库中,但是具有相同id的文档在复制到一个数据库中时应该变成"eventual conflicts",所以一个文档会丢失并且仅通过显式请求冲突在合并的数据库中可见。
使用非随机 ID 时,您应该至少更新一个数据库以使用唯一的命名空间,例如
Event-2017-01
。如果您想使用仍然分离的远程数据库实现双向复制,这也将简化您需要的复制过滤器。
我通常给文档的附件一个单独的文档,它有前缀,即:attachment-[orig_id]
这样媒体就可以从复制中过滤掉。您可能需要考虑以这种方式(至少一个数据库)解析附件,这样您就可以在一个 "media" 数据库中将所有附件与给定客户端的理想适配器混合使用,并使用其他适配器进行正常文档。
例如,您可能有:
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'});
如果基于原始文档将带有媒体的字段拆分到另一个文档中,那么您还没有冗余副本。但是您可以构建从新闻和事件中获取的临时数据库:
today = new Pouchdb('today', {adapter:'memory'}).
replicate.from(news, {selector ..dayview..}).
replicate.from(events, ...selector...);
其中临时数据库使用的资源相对较少,但它们的文档用作相应媒体数据库文档的索引。