使用 Cordova 和 PouchDB 的离线数据
Offline data with Cordova and PouchDB
我正在用 Cordova 编写字典应用程序。数据大小约为20MB。
我希望应用程序完全脱机工作,并在本地查询数据。我发现 PouchDB 非常适合。
不过,我还希望应用程序预装所有数据(JSON 格式)。也就是把所有的数据放到app包中(在Cordova工程的www/data文件夹中)
据我所知,PouchDB 可以从服务器创建数据或同步数据,但我想知道它如何利用应用程序的 www 文件夹中的数据文件。
而且,我应该如何格式化数据文件,以便 PouchDB 可以直接从中查询,而不必先从文件中读取数据,然后再将数据插入 PouchDB。
有人有什么想法吗?或者其他任何可以完成此任务的 JS 库?
谢谢!
http://pouchdb.com/adapters.html
具体看sqlite插件。您可以找到生成的 sqlite 数据库并分发它。
经过一番研究,我现在想比较一些可能的选择:
直接使用PouchDB
这不切实际,因为:1)您必须在第一次启动时将数据插入 PouchDB,这可能会非常慢; 2)内存使用率很高,因为你会先把所有数据加载到内存中(除非你拆分它们); 3) Cordova 应用程序不能在后台运行;用户可以在插入数据时退出应用程序。
PouchDB 的 sqlite 插件
一个可能的解决方案。您需要使用文件传输插件将数据复制到 'working folder'。
缺点:
- 有点麻烦,因为您需要另一个工作流程来创建 sqlite 文件。
- PouchDB 的 sqlite 适配器没有通过所有测试套件,而且官方文档建议的速度可能更慢。
- 额外 space 用法 (2x);必须将应用程序包中的数据复制到数据文件夹中,以便 Sqlite 使用。
将数据拆分为较小的 json 应用包内的文件(在 /www 文件夹中)
这是我目前使用的。我将我的数据分成大约 100 个较小的 .json 文件并将它们放在 /www 文件夹中。然后我可以使用 XHR 请求根据查询动态加载它们。
专业版:
- 不需要额外的 space;只有一份数据
缺点:
- 失去 PouchDB 的所有特性及其查询方法;它基本上是在实现自定义 read-only 数据库。
Lokijs
Lokijs 是一个高性能 in-memory 数据库。它可以从 JSON 加载数据库,或者(使用 unoffical plugin)从文件系统加载数据库。
缺点:
- 因为 Lokijs 是一个 in-memory 数据库。内存使用可能是大数据量和移动设备上的问题。
另一件值得期待的事情是 PouchDB 的文件系统适配器。至少有人在考虑:https://github.com/pouchdb/pouchdb/issues/4631
预加载数据时出现问题:
预加载数据通常是指将应用程序包内的数据复制到OS(因平台而异)提供的数据目录中。
Cordova的File plugin和File Transfer plugin经常会涉及到。
目前文件插件无法访问应用程序包内的数据,(尽管插件中定义了 appDirectory)。您必须使用文件传输插件将您的数据文件从应用程序包复制到数据文件夹。
https://pouchdb.com/2016/04/28/prebuilt-databases-with-pouchdb.html 涵盖了如何在您的应用程序中包含 pre-built 数据的分步说明。您可以使用 sqlite 数据库文件或原始文本文件。
我正在用 Cordova 编写字典应用程序。数据大小约为20MB。
我希望应用程序完全脱机工作,并在本地查询数据。我发现 PouchDB 非常适合。
不过,我还希望应用程序预装所有数据(JSON 格式)。也就是把所有的数据放到app包中(在Cordova工程的www/data文件夹中)
据我所知,PouchDB 可以从服务器创建数据或同步数据,但我想知道它如何利用应用程序的 www 文件夹中的数据文件。
而且,我应该如何格式化数据文件,以便 PouchDB 可以直接从中查询,而不必先从文件中读取数据,然后再将数据插入 PouchDB。
有人有什么想法吗?或者其他任何可以完成此任务的 JS 库?
谢谢!
http://pouchdb.com/adapters.html 具体看sqlite插件。您可以找到生成的 sqlite 数据库并分发它。
经过一番研究,我现在想比较一些可能的选择:
直接使用PouchDB
这不切实际,因为:1)您必须在第一次启动时将数据插入 PouchDB,这可能会非常慢; 2)内存使用率很高,因为你会先把所有数据加载到内存中(除非你拆分它们); 3) Cordova 应用程序不能在后台运行;用户可以在插入数据时退出应用程序。
PouchDB 的 sqlite 插件
一个可能的解决方案。您需要使用文件传输插件将数据复制到 'working folder'。
缺点:
- 有点麻烦,因为您需要另一个工作流程来创建 sqlite 文件。
- PouchDB 的 sqlite 适配器没有通过所有测试套件,而且官方文档建议的速度可能更慢。
- 额外 space 用法 (2x);必须将应用程序包中的数据复制到数据文件夹中,以便 Sqlite 使用。
将数据拆分为较小的 json 应用包内的文件(在 /www 文件夹中)
这是我目前使用的。我将我的数据分成大约 100 个较小的 .json 文件并将它们放在 /www 文件夹中。然后我可以使用 XHR 请求根据查询动态加载它们。
专业版:
- 不需要额外的 space;只有一份数据
缺点:
- 失去 PouchDB 的所有特性及其查询方法;它基本上是在实现自定义 read-only 数据库。
Lokijs
Lokijs 是一个高性能 in-memory 数据库。它可以从 JSON 加载数据库,或者(使用 unoffical plugin)从文件系统加载数据库。
缺点:
- 因为 Lokijs 是一个 in-memory 数据库。内存使用可能是大数据量和移动设备上的问题。
另一件值得期待的事情是 PouchDB 的文件系统适配器。至少有人在考虑:https://github.com/pouchdb/pouchdb/issues/4631
预加载数据时出现问题:
预加载数据通常是指将应用程序包内的数据复制到OS(因平台而异)提供的数据目录中。
Cordova的File plugin和File Transfer plugin经常会涉及到。 目前文件插件无法访问应用程序包内的数据,(尽管插件中定义了 appDirectory)。您必须使用文件传输插件将您的数据文件从应用程序包复制到数据文件夹。
https://pouchdb.com/2016/04/28/prebuilt-databases-with-pouchdb.html 涵盖了如何在您的应用程序中包含 pre-built 数据的分步说明。您可以使用 sqlite 数据库文件或原始文本文件。