uni-app sqlite组件的executeSql函数attach database异常
uni-app sqlite组件的executeSql函数attach database异常
测试过的手机:
- mate20
示例代码:
let sql = ATTACH DATABASE '/static/a/test' AS binliDB;
let exec = this.$sqlite.executeSql(sql)
操作步骤:
- 准备
/static/a/test的 sqlite 数据库和主数据库1。 - 先打开数据库1,
this.$sqlite.openDb() - 打开数据库1成功后,和附加 test 数据库,如上面的 attach database 操作
预期结果:
- attach database 成功
实际结果:
- 报错 “android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database: /static/a/test (Sqlite code 14 SQLITE_CANTOPEN), (OS error - 2:No such file or directory)”。
bug描述:
使用 sqlite 组件的 executeSql 函数,实现 attach database 功能,我这边 opendatabase 成功了后,和放在 static 目录下的 test 文件进行 attach database,可是却总是报错 “android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database: /static/a/test (Sqlite code 14 SQLITE_CANTOPEN), (OS error - 2:No such file or directory)”。
| 信息类别 | 详情 |
|----------------|-------------------------------|
| 产品分类 | uniapp/App |
| PC开发环境 | Windows |
| PC开发环境版本 | Windows 11 家庭中文版 22621.2428 |
| HBuilderX类型 | 正式 |
| HBuilderX版本 | 4.02 |
| 手机系统 | 全部 |
| 手机厂商 | 华为 |
| 页面类型 | vue |
| vue版本 | vue2 |
| 打包方式 | 云端 |
| 项目创建方式 | HBuilderX |
更多关于uni-app sqlite组件的executeSql函数attach database异常的实战教程也可以访问 https://www.itying.com/category-93-b0.html
程序流程: 1、先openDataBase一个固定数据库sDBFilePathName 2、把一个备用数据库sStaticUserDBFilePathName拷贝到新目录sCopyDBFilePathName, 3、attach database 自动生成的sCopyDBFilePathName数据库,当然attach 的时候,也可以直接指定/static/b/test数据库,但都是一样的报错
this.globalData.sDBFilePathName = ‘/static/a/test’ this.globalData.sStaticUserDBFilePathName = ‘/static/b/test’ this.globalData.sCopyDBFilePathName = ‘’
this.openDataBase() this.copyDBFile() this.attachDatabase()
openDataBase(){ console.log(‘openDataBase’); let open = this.$sqlite.isOpen(this.globalData.sDBName, this.globalData.sDBFilePathName) if (!open) { this.$sqlite.openDb(this.globalData.sDBName, this.globalData.sDBFilePathName) } else { console.log(‘数据库已打开’); } }, copyDBFile(){ uni.saveFile({ tempFilePath: this.globalData.sStaticUserDBFilePathName, success:(res) => { this.globalData.sCopyDBFilePathName = res.savedFilePath; this.attachDatabase() }, fail:(res) => { console.log(tempFilePath,res); } }); },
attachDatabase(){ if(this.globalData.sCopyDBFilePathName == ‘’){ return } let sql =ATTACH DATABASE ‘${this.globalData.sCopyDBFilePathName}’ AS liDB;
},
let sql =ATTACH DATABASE ‘${this.globalData.sCopyDBFilePathName}’ AS liDB; 上面这个代码,贴上去的时候少了类似下面的``
必须为本地地址,支持以下类型路径: 5+ API路径(RelativeURL) - 以"_“开头的相对路径,如”_doc/a.db"(推荐使用"_doc/x.db"目录保存); 相对路径 - 相对于当前页面的host位置,如"a.db"(不推荐使用,相对路径无法写入数据,只能读取数据); 绝对路径 - 系统绝对路径,如Android平台"/sdcard/a.db",此类路径通常通过其它5+ API获取的(不推荐使用,无法跨平台); 本地路径URL - 以“file://”开头,后面跟随系统绝对路径。 注意:写入数据需符合系统沙盒权限机制,应用资源目录(_www)目录通常不允许写操作,只能读取。


