在React App中使用或不使用PouchDB加载预构建的SQlite数据库的正确方法是什么

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在React App中使用或不使用PouchDB加载预构建的SQlite数据库的正确方法是什么相关的知识,希望对你有一定的参考价值。

目前我正在编写一个React App并且正在努力从SQlite数据库中读取一个简单的内容。

由于问题不明确而编辑:

***目标是在没有任何后端的情况下从数据库中读取数据,因为即使数据库处于脱机状态,它也需要从数据库中读取数据。

***我的目标是进行ONE TIME文件转换,然后离线pouchdb查询。但我不想手动操作,因为有大约6k +注册表。

***或者没有任何API的浏览器的SQL查询,但我需要支持Internet Explorer,因此WebSQL不是一个选项。我已经尝试过sqlite3库,但我无法使用Create React App。

我尝试的解决方案是使用PouchDB来读取文件,但我得出的结论是,如果不使用cordova就不可能使用PouchDB PRELOAD SQlite文件(我对它不满意,我不想要任何运行的服务器),甚至是某种适配器。

那么这是正确的做事方式吗?

有没有办法我不会丢失我的.db数据,并且必须手动将其全部转换?

我应该忘记在IE上支持这些功能吗?

谢谢 :)

答案

试试这个:

sqlite3 example "DROP TABLE IF EXISTS some_table;";
sqlite3 example "CREATE TABLE IF NOT EXISTS some_table (id INTEGER PRIMARY KEY AUTOINCREMENT, anattr VARCHAR, anotherattr VARCHAR);";
sqlite3 example "INSERT INTO some_table VALUES (NULL, '1stAttr', 'AttrA');";
sqlite3 example "INSERT INTO some_table VALUES (NULL, '2ndAttr', 'AttrB');";

## Create three JSON fragment files
sqlite3 example ".output result_prefix.json" "SELECT '{ "docs": ['";
sqlite3 example ".output rslt.json" "SELECT '{ "_id": "someTable_' || SUBSTR("000000000" || id, LENGTH("000000000" || id) - 8, 9) || '", "anattr": "' || anattr || '", "anotherattr": "' || anotherattr || '" },' FROM some_table;";
sqlite3 example ".output result_suffix.json" "SELECT '] }'";

## strip trailing comma of last record
sed -i '$ s/.$//' rslt.json;

## concatenate to a single file
cat result_prefix.json rslt.json result_suffix.json > result.json;

cat result.json;

您应该只需将上面的行粘贴到(unix)命令行上,看看输出:

{ "docs": [
{ "_id": "someTable_000000001", "anattr": "1stAttr", "anotherattr": "AttrA" },
{ "_id": "someTable_000000002", "anattr": "2ndAttr", "anotherattr": "AttrB" }
] }

如果你安装了jq,你可以做...

cat result.json | jq .

......获得:

{
  "docs": [
    {
      "_id": "someTable_000000001",
      "anattr": "1stAttr",
      "anotherattr": "AttrA"
    },
    {
      "_id": "someTable_000000002",
      "anattr": "2ndAttr",
      "anotherattr": "AttrB"
    }
  ]
}

您将在博客文章Prebuilt databases with PouchDB的第2部分中找到一个如何快速从JSON文件初始化PouchDB的示例。

因此,如果您有可用的CouchDB服务器,您可以执行以下操作:

export COUCH_DB=example;
export COUCH_URL= *** specify yours here ***;
export FILE=result.json;

## Drop database
curl -X DELETE ${COUCH_URL}/${COUCH_DB};

## Create database
curl -X PUT ${COUCH_URL}/${COUCH_DB};

## Load database from JSON file
curl -H "Content-type: application/json" -X POST "${COUCH_URL}/${COUCH_DB}/_bulk_docs"  -d @${FILE};

## Extract database with meta data to PouchDB initialization file
pouchdb-dump ${COUCH_URL}/${COUCH_DB} > example.json

## Inspect PouchDB initialization file
cat example.json | jq .

显然你需要一些改编,但上面应该没有问题。

另一答案

由于Couch / Pouch-DB是面向文档的DB,所有记录都称为docs,因此只有JSON即JS对象。在我的RN应用程序中,当我遇到类似的任务时,我只是将我希望在PouchDB中“预先填充”的所有文档放在一个JS对象数组中,将其作为模块导入我的应用程序,然后在app init期间将它们写入PDB作为必要的文档。这都是预先填充的。如何将SQL DB记录导出为JSON - 您决定,这肯定取决于您希望在PDB中使用的源数据库结构和数据逻辑。

以上是关于在React App中使用或不使用PouchDB加载预构建的SQlite数据库的正确方法是什么的主要内容,如果未能解决你的问题,请参考以下文章

构建一个支持 React Web 应用程序和问题的 SQlite/PouchDB?

排毒测试 + React Native + PouchDB 应用程序:由于一些 PouchDB 同步,我们的登录测试一直失败并超时?

pouchdb 无法在 ios Safari 上运行

Flux waitFor() 和异步操作,如何建模。

使用 PouchDB 的 Ionic 应用程序性能问题

PouchDB 和 SvelteKit