最近在集成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模擬器的情況下測試拷貝成功了,實體機測試晚點再看看,應該也問題不大。
<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>