uni-app Sqlite在IOS手机上返回上一页时会自动关闭数据库

uni-app Sqlite在IOS手机上返回上一页时会自动关闭数据库

操作步骤:

  • APP运行到真机后点击【一键复现BUG】按钮,然后返回上一页,等待几秒后就能看到数据库自动关闭了。

预期结果:

  • 像安卓手机一样,数据库不应该自动关闭

实际结果:

  • 数据库自动关闭了,Sqlite错误码:-1401。

bug描述:

  • Sqlite在IOS手机上返回上一页时会自动关闭数据库,安卓5.0版本的魅族MX5手机和OPPO A59s手机测试没问题。
开发环境 版本号 项目创建方式
PC Windows 10 21H1 HBuilderX
手机 iOS
iOS 14
手机厂商 苹果
手机机型 iPhone12
页面类型 nvue
打包方式 云端

更多关于uni-app Sqlite在IOS手机上返回上一页时会自动关闭数据库的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

BUG演示文件

更多关于uni-app Sqlite在IOS手机上返回上一页时会自动关闭数据库的实战教程也可以访问 https://www.itying.com/category-93-b0.html


问题已确认,下版本我们会修复此问题

修复了吗?23年了

Alpha v3.2.11版本已修复该BUG

这是一个典型的iOS与Android平台差异问题,主要原因是iOS平台对Webview(包括uni-app的nvue页面)的生命周期管理更为严格。

核心原因分析: 在iOS上,当页面返回(pop)时,系统可能会立即回收该页面的Webview实例及其关联的JavaScript上下文。此时,在该页面中打开的SQLite数据库连接(属于该页面上下文)会被强制关闭。而Android平台通常允许数据库连接在应用退出前保持更长时间。

解决方案:

  1. 全局单例管理数据库连接:不要在单个页面内打开和操作数据库。应在应用启动时(如App.vueonLaunch中)或一个全局状态管理模块中,建立唯一的数据库连接,并导出给所有页面共享使用。确保数据库的生命周期与整个应用一致,而非与单个页面绑定。

  2. 使用plus.sqlite的异步API:在操作数据库时,确保使用plus.sqlite的异步方法(如executeSql),并妥善处理回调。避免在页面即将销毁时仍有未完成的同步数据库操作。

  3. 在页面生命周期中谨慎操作:避免在页面的onUnloadonHide生命周期函数中进行复杂的数据库写入操作。如果必须执行,应确保操作快速完成,或考虑将关键数据操作移至全局模块中。

代码结构建议: 创建一个独立的db.js模块:

// db.js
let db = null;
export function openDatabase() {
    if (!db) {
        db = plus.sqlite.openDatabase({
            name: 'test.db',
            path: '_doc/test.db'
        });
    }
    return db;
}
// 导出其他数据库操作方法
回到顶部