React native 在React本机应用程序中预加载/预填充数据库
是否可以在我的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中
- 数据库查找:^7.0.0
- 本机数据库:^6.4.1
- 反应:16.3.1
- 反应力矩:^0.7.9
- 反应本机:~0.55.2
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在此平台上不可用