React native 在React本机应用程序中预加载/预填充数据库

React native 在React本机应用程序中预加载/预填充数据库,react-native,pouchdb,React Native,Pouchdb,是否可以在我的React本机应用程序中预加载/预填充数据库,然后在第一次运行时只需执行同步?在应用程序发布之前,我已经拥有了大部分(如果不是全部的话)数据库信息,如果它在应用程序运行时只需要快速同步,那就太棒了。你知道我该怎么做吗 我发现了这个-但它没有提到反应 使用: 数据库查找:^7.0.0 本机数据库:^6.4.1 反应:16.3.1 反应力矩:^0.7.9 反应本机:~0.55.2 谢谢你的指点 更新这里是我用来尝试加载转储文件的代码。此代码存在于/screens/Home.js中

是否可以在我的React本机应用程序中预加载/预填充数据库,然后在第一次运行时只需执行同步?在应用程序发布之前,我已经拥有了大部分(如果不是全部的话)数据库信息,如果它在应用程序运行时只需要快速同步,那就太棒了。你知道我该怎么做吗

我发现了这个-但它没有提到反应

使用:

  • 数据库查找:^7.0.0
  • 本机数据库:^6.4.1
  • 反应:16.3.1
  • 反应力矩:^0.7.9
  • 反应本机:~0.55.2
谢谢你的指点

更新这里是我用来尝试加载转储文件的代码。此代码存在于/screens/Home.js中 转储文件位于/client/dbfile/database.txt中

var db = new PouchDB("cs1");

db.get("_local/initial_load_complete")
  .catch(function(err) {
    console.log("loading dumpfile");
    if (err.status !== 404) {
      // 404 means not found
      throw err;
    }
    db.load("/client/dbfile/database.txt").then(function() {
      return db.put({ _id: "_local/initial_load_complete" });
    });
  })
  .then(function() {
    // at this point, we are sure that
    // initial replication is complete
    console.log("loading is complete!");
    return db.allDocs({ include_docs: true });
  })
  .then(
    function(res) {
      // display all docs for debugging purposes (empty)
      console.log(res);
    });

this.localDB = db;
当运行此命令时,我的控制台将显示此命令-显示已添加0行

Object {
    "offset": 0,
    "rows": Array [],
    "total_rows": 0,
}
Possible Unhandled Promise Rejection (id: 0):
Object {
    "message": undefined,
    "name": "unknown",
    "status": 0,
}

我发现模块中的
db.load()
函数需要一个URL。我把它指向设备文件系统上的一个文件路径。我把database.txt文件放在我的服务器上,将其更改为使用url,它就工作了


在我看来,这并不理想,因为如果他们安装了应用程序,并且无线速度很慢,它仍然需要从服务器上提取文件。但是,它仍然比第一次打开应用程序时执行完全复制快得多。

在我的项目中,我有两个db文档随应用程序一起分发(翻译JSON就是一个很好的例子)。 所以在appinit中,我只是尝试从数据库中读取翻译文档,如果没有,我就从js模块导入内容并存储在数据库中。 然后,将更改从服务器复制到本地数据库

//transmob.js
const transMobFile = {
//content goes here
);
module.exports = transMobFile

//dbInit.js
import transMobFile from 'data/transMob';
..
PDB.getDoc('TransMob')
.then((doc)=> {
  if (!doc) {
  global.locales = transMobFile.localesMob; // locales
  global.translations = transMobFile.langMob; // translations
  return PDB.saveDoc('TransMob', transMobFile)
  }
})

您可以使用react native fs从/android/app/src/main/assets加载文件。只需将文件放入assets文件夹,并使用RNFS.readFileAssets读取即可

import PouchDB from 'pouchdb-core';

PouchDB
 .plugin(require('pouchdb-find'))
 .plugin(require('pouchdb-load'));

import RNFS from 'react-native-fs';

const localDB = new PouchDB("cs1", {adapter: 'asyncstorage'});


localDB.get("_local/initial_load_complete")
 .catch(function(err) {
   console.log("loading dumpfile");
   if (err.status !== 404) {
    // 404 means not found
     throw err;
   }

 RNFS.readFileAssets('yourdb.txt', 'utf8')
    .then((contents) => {
      localDB.load(contents).then(function() {
        return localDB.put({ _id: "_local/initial_load_complete" });
      }).then(function() {
        // at this point, we are sure that
        // initial replication is complete
        console.log("loading is complete!");
        return localDB.allDocs({ include_docs: true }).then(
          function(res) {
            // display all docs for debugging purposes (empty)
            console.log(res);
          });
      }, function(err) {
        console.log(err);
      });
    })
 })
您需要重建项目,重新加载是不够的。
当我试图加载一个30MB的文件时,我的项目崩溃了,所以我可能会将它拆分成几个较小的文件。如果需要,请查看它是如何工作的。

后续:我在上面的文章中尝试从转储文件加载,但是我得到了
db.load不是一个函数。(在“db.load”(“client/dbfile/database.txt”),“db.load”未定义)
错误消息能否共享代码?后续:解决了负载未定义的问题,我必须安装此插件并添加插件
backdb.plugin(require('backdb-load'))但是,我没有收到任何文档。用一些代码更新我的初始问题,速度无限快。。。所以现在它实际上需要0时间吗?:)但更严重的是。。。我认为这个答案并不完整。什么是
db.load()
?这不是常规(文档化)数据库API的一部分。你在使用插件吗?这将是很好的,包括在这里。是的,初始加载时间几乎是立即的,它的美妙。我使用了这个模块-hmmm,安装了它,链接了它,添加了导入,修改了我的代码,得到错误:readFileAssets在此平台上不可用