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)

操作步骤:

  1. 准备 /static/a/test 的 sqlite 数据库和主数据库1。
  2. 先打开数据库1,this.$sqlite.openDb()
  3. 打开数据库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

10 回复

代码怎么写的?

更多关于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)目录通常不允许写操作,只能读取。

在使用 uni-app 开发时,如果你在 SQLite 组件中调用 executeSql 函数并尝试使用 ATTACH DATABASE 语句时遇到异常,可能有以下几种原因和解决方案:

1. SQLite 版本问题

  • 问题描述:某些版本的 SQLite 可能不支持 ATTACH DATABASE 语句,或者在某些环境下(如移动端)支持不完整。
  • 解决方案:确保你使用的 SQLite 版本支持 ATTACH DATABASE 语句。如果可能,升级到最新版本的 SQLite。

2. 路径问题

  • 问题描述:在使用 ATTACH DATABASE 时,数据库文件的路径可能不正确,导致无法附加数据库。
  • 解决方案:确保你提供的路径是绝对路径,并且数据库文件确实存在于该路径下。在移动端,路径可能需要使用特定的文件系统 API 来获取。

3. 权限问题

  • 问题描述:在移动端,应用程序可能没有权限访问指定的数据库文件路径,导致 ATTACH DATABASE 失败。
  • 解决方案:确保你的应用程序有权限访问指定的路径。在 Android 和 iOS 上,可能需要请求相应的文件访问权限。

4. 数据库文件格式问题

  • 问题描述:如果目标数据库文件的格式不正确或损坏,ATTACH DATABASE 可能会失败。
  • 解决方案:检查目标数据库文件是否有效,并且格式正确。你可以使用 SQLite 工具(如 sqlite3 命令行工具)来验证数据库文件的完整性。

5. SQLite 配置问题

  • 问题描述:某些 SQLite 配置可能限制了 ATTACH DATABASE 的使用,例如启用了某些安全策略或限制。
  • 解决方案:检查 SQLite 的配置,确保没有限制 ATTACH DATABASE 的使用。

6. uni-app SQLite 组件问题

  • 问题描述uni-app 的 SQLite 组件可能存在 Bug 或限制,导致 ATTACH DATABASE 语句无法正常执行。
  • 解决方案:尝试使用原生 SQLite API 来执行 ATTACH DATABASE 语句,或者检查 uni-app 的官方文档和社区,看看是否有已知的解决方案或替代方案。

7. SQL 语句语法问题

  • 问题描述ATTACH DATABASE 语句的语法可能不正确,例如缺少引号或路径格式错误。
  • 解决方案:仔细检查 ATTACH DATABASE 语句的语法,确保路径和数据库名称正确。

示例代码

以下是一个简单的示例,展示如何在 uni-app 中使用 executeSql 函数执行 ATTACH DATABASE 语句:

// 假设你已经打开了主数据库
plus.sqlite.openDatabase({
  name: 'main.db',
  path: '_doc/main.db',
  success: function(e) {
    console.log('主数据库打开成功');
    // 执行 ATTACH DATABASE 语句
    plus.sqlite.executeSql({
      name: 'main.db',
      sql: "ATTACH DATABASE '_doc/secondary.db' AS secondary",
      success: function(e) {
        console.log('附加数据库成功');
      },
      fail: function(e) {
        console.log('附加数据库失败: ' + JSON.stringify(e));
      }
    });
  },
  fail: function(e) {
    console.log('主数据库打开失败: ' + JSON.stringify(e));
  }
});
回到顶部