是否可以在React Native应用程序中预加载/预填充数据库,然后在首次运行时简单地进行同步?在分发应用程序之前,我已经掌握了大多数(如果不是全部)数据库信息,如果在运行应用程序时仅需要进行快速同步,那将是非常棒的。有什么想法我会去做的吗?
我发现了这个-https://pouchdb.com/2016/04/28/prebuilt-databases-with-pouchdb.html,但没有提到React Native
使用:
感谢任何指针。
更新这是我用来尝试加载转储文件的代码。该代码存在于/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,
}
答案 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,了解其工作原理。