柴先生
柴先生
  • 发布:2023-03-29 09:01
  • 更新:2023-05-19 23:53
  • 阅读:411

【报Bug】plus.sqlite数据库ios端报错,并丢失数据

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: Windows 11 家庭中文版 22H2

HBuilderX类型: 正式

HBuilderX版本号: 3.7.3

手机系统: iOS

手机系统版本号: iOS 15

手机厂商: 苹果

手机机型: iPhone 7 Plus、iPhone 12

页面类型: vue

vue版本: vue2

打包方式: 云端

项目创建方式: HBuilderX

示例代码:

onLoad() {
           // 初始化数据库
           this.sqlListInitialize()
},
methods: {
           // 初始化数据库
           sqlListInitialize() {
               let dbname = this.dbname
               plus.sqlite.openDatabase({
                   name: dbname,
                   path: _doc/${dbname}.db,
                   success: (res) => {
                       console.log('数据库打开成功')
                   },
                   fail: (err) => {
                       console.log('数据库已打开')
                   },
               });
               setTimeout(() => {
                   let sqlCode =
                       'create table if not exists t_device ("id" INTEGER PRIMARY KEY AUTOINCREMENT,"deviceId" TEXT,"name" TEXT)'
                   plus.sqlite.executeSql({
                       name: dbname,
                       sql: sqlCode,
                       success: (res) => {
                           console.log('初始化成功')
                       },
                       fail: (err) => {
                           console.log(err)
                       },
                   });
               }, 500)
               setTimeout(() => {
                   let data = [{
                       deviceId: '12456',
                       name: 'a1'
                   }, {
                       deviceId: '12458',
                       name: 'a2'
                   }, {
                       deviceId: '12459',
                       name: 'a3'
                   }]
                   this.addSaveData('t_device', data)
               }, 1500)
               setTimeout(() => {
                   plus.sqlite.selectSql({
                       name: dbname, // 数据库名称
                       sql: "select * from t_device",
                       success(res) {
                           console.log('查询全部数据' + res.length + '条')
                           console.log(res)
                       },
                       fail(e) {
                           console.log(e)
                       },
                   });
               }, 2500)
           },
           addSaveData(tabName, data) {
               data.forEach((item, index) => {
                   let keys = Object.keys(item);
                   let keyStr = keys.toString();
                   let valStr = "";
                   keys.forEach((item1, index1) => {
                       if (keys.length - 1 == index1) {
                           valStr += '"' + item[item1] + '"';
                       } else {
                           valStr += '"' + item[item1] + '",';
                       }
                   });
                   let sqlStr = insert into ${tabName}(${keyStr}) values(${valStr});
                   plus.sqlite.executeSql({
                       name: this.dbname,
                       sql: sqlStr,
                       success: (res) => {
                           console.log("数据添加成功!", res);
                       },
                       fail: (err) => {
                           console.log("数据添加失败!", err);
                       },
                   });
               });
           },
}

操作步骤:

见bug描述

预期结果:

ios端数据库数据正常

实际结果:

ios端数据库报错并丢失数据

bug描述:

【首页中报的错】
1、进入首页数据库初始化成功后查询数据(正常)
2、然后修改页面js代码(任意js代码)后,热更新正常(查询数据库数据正常)
3、然后点击开发工具的【重新运行】,进入首页后会报"code": -1404, "message": "Error:disk I/O error,https://ask.dcloud.net.cn/article/282"
4、然后在次点击开发工具的【重新运行】,进入首页后报错信息消失,初始化数据库后查询数据库【数据丢失(都是0条数据)】

【内页中不报错直接数据丢失】
1、测试页面是直接进入的(pages中第一个页面就是测试页面),与首页执行相同的代码、相同的操作后
2、测试页面修改js代码(任意js代码)后,热更新正常(查询数据库数据正常)
3、点击开发工具的【重新运行】,进入测试页不报错(没有任何报错信息),但是数据丢失了【数据库是0条数据】

ios目前测试机型 7 plus 和 12,版本号15.7.4 和16.0 均是同样的错误
同样的代码安卓端数据均正常

2023-03-29 09:01 负责人:DCloud_iOS_WZT 分享
已邀请:
DCloud_iOS_WZT

DCloud_iOS_WZT

发个能复现问题的demo吧

  • 柴先生 (作者)

    大概写了一下demo,这个demo安卓手机中没有问题,ios手机中重新运行会报错误 -1404 ,"Error:disk I/O error,https://ask.dcloud.net.cn/article/282"

    2023-03-29 15:46

  • 柴先生 (作者)

    每次点击重新运行都会报错

    2023-03-29 15:46

  • DCloud_iOS_WZT

    回复 柴先生: demo发给我 可以放到机要附件里

    2023-03-29 19:28

  • 柴先生 (作者)

    回复 DCloud_iOS_WZT: 已放入附件中,输出都在控制台,

    操作步骤存入数据后,修改任意js代码,热更新完毕,重新运行(完毕后再次重新运行)(报错出现几率90%)

    2023-03-30 08:41

  • DCloud_iOS_WZT

    回复 柴先生: 我没复现你的问题 但是我这边如果修改代码 保存刷新 调用addSaveData 会报Attempt to write a readonly database

    2023-03-31 19:27

  • DCloud_iOS_WZT

    回复 柴先生: 你那个报错可能是setTimeout导致的 同时读写数据库报错

    2023-03-31 19:29

蓓岑2015

蓓岑2015

是不是要手机存储权限?

要回复问题请先登录注册