最近在集成sqlite到uniapp的过程中,因为要将sqlite数据库预加载,所以需要使用HTML5的plus.io模块。使用过程中遇到了许多问题,比如文件路径总是解析不到等。尤其是应用私有文档目录'_doc'。
根据官方文档:
为了安全管理应用的资源目录,规范对文件系统的操作,5+ API在系统应用目录的基础设计了应用沙盒目录, 分为私有目录和公共目录两种类型,私有目录仅应用自身可以访问,公共目录在多应用环境时(如小程序SDK)所有应用都可访问。
应用私有资源目录,对应常量plus.io.PRIVATE_WWW,仅应用自身可读
应用私有文档目录,对应常量plus.io.PRIVATE_DOC,仅应用自身可读写
应用公共文档目录,对应常量plus.io.PUBLIC_DOCUMENTS,多应用时都可读写,常用于保存应用间共享文件
应用公共下载目录,对应常量plus.io.PUBLIC_DOWNLOADS,多应用时都可读写,常用于保存下载文件
plus.io.PRIVATE_WWW表示'_www'目录,实际值为1;plus.io.PRIVATE_DOC表示"__doc"目录,实际值为2;
因此不能把他们简单等同,要看方法需要的参数类型是什么。如果需要的参数类型是number,就使用常量,如果类型是string,则使用具体url路径。
别的不说了先,官方文档还是得仔细读读,虽然存在5%的小错误,但是还是可以提供帮助。
上代码!
我的需求是将数据库文件fit_path_app.db从_www拷贝到__doc目录下。该文件在项目中位于/static/database目录下,我是直接把整个目录拷贝到doc/db/目录下。
关于doc为什么直接使用字符串而不是本地文件路径,因为我发现如果在初始化时使用本地文件路径会解析地址失败,但是直接使用字符串则不会。原因不详。
最终使用下面的方法,目前在uniapp真机运行和使用mumu模拟器的情况下测试拷贝成功了,实体机测试晚点再看看,应该也问题不大。
javascript
<script>
export default {
onLaunch: function() {
const sourcePath = plus.io.convertLocalFileSystemURL('_www/static/database');
// const targetRootPath = plus.io.convertLocalFileSystemURL('_doc/')
const targetRootPath = '_doc/'
// const targetFilePath = plus.io.convertLocalFileSystemURL('_doc/fit_path_app.db')
const targetFilePath = 'db/'
const paths = {
source: sourcePath,
targetRoot: targetRootPath,
targetFile: targetFilePath
}
console.log('源和目标路径:',JSON.stringify(paths));
plus.io.resolveLocalFileSystemURL(sourcePath,function(srcEntry) {
plus.io.resolveLocalFileSystemURL(targetRootPath,function(targetEntry) {
// 拷贝
srcEntry.copyTo(targetEntry,targetFilePath,function(entry) {
console.log('拷贝成功:',entry.fullPath);
},function(e) {
conso.error('拷贝失败:',JSON.stringify(e));
})
}, function(e){
console.error('解析目标地址失败:',JSON.stringify(e))
})
}, function(e) {
console.error('解析源地址失败:',JSON.stringify(e))
})
console.log('Database initialized successfully.');
console.log('App Launch')
},
onShow: function() {
console.log('App Show')
},
onHide: function() {
console.log('App Hide')
}
}
</script>