在React Native应用程序中预加载/预填充PouchDB

时间:2018-09-07 11:44:40

标签: react-native pouchdb

是否可以在React Native应用程序中预加载/预填充数据库,然后在首次运行时简单地进行同步?在分发应用程序之前,我已经掌握了大多数(如果不是全部)数据库信息,如果在运行应用程序时仅需要进行快速同步,那将是非常棒的。有什么想法我会去做的吗?

我发现了这个-https://pouchdb.com/2016/04/28/prebuilt-databases-with-pouchdb.html,但没有提到React Native

使用:

  • pouchdb查找:^ 7.0.0
  • pouchdb-react-native:^ 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,
}

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

//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)
  }
})

答案 2 :(得分:0)

您可以使用react-native-fs从/ android / app / src / main / 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的文件时,我的项目崩溃了,因此我可能会将其拆分为几个较小的文件。请查看https://github.com/pouchdb-community/pouchdb-load,了解其工作原理。