用户1946233
用户1946233
  • 发布:2025-12-03 14:32
  • 更新:2025-12-03 15:11
  • 阅读:32

【报Bug】自启动、Launcher模式下SQLite读取异常

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: win10

HBuilderX类型: 正式

HBuilderX版本号: 4.85

手机系统: Android

手机系统版本号: Android 12

手机厂商: PDA MTK主板

手机机型: V510B

页面类型: vue

vue版本: vue2

打包方式: 云端

项目创建方式: HBuilderX

操作步骤:

问题复现步骤(适用于 UniApp + Android)
✅ 前提条件

  1. 使用 UniApp 开发一个 Android 应用;
  2. 应用中使用 plus.sqlite 操作本地 SQLite 数据库(未显式指定完整路径,仅使用 name);
  3. 将应用设置为 开机自启动(通过监听 BOOT_COMPLETED 广播),或 将应用配置为 Launcher 桌面应用(替换系统桌面);
  4. 测试设备包含 低端 Android 机型(如 2GB 内存以下、Android 8~10 系统)。

复现流程

  1. 首次安装并正常启动 App
    手动点击图标打开应用;
    应用写入若干测试数据到 SQLite(例如插入一条用户记录);
    验证数据可正常查询 → ✅ 正常。

  2. 重启设备
    保持 App 设置为开机自启 或 已设为 Launcher 桌面;
    完全重启 Android 设备。

  3. 等待 App 自动启动
    设备启动后,App 由系统自动拉起(非手动点击);
    App 在启动时尝试读取之前写入的数据库记录。

  4. 观察现象
    查询结果为空,或提示表不存在;
    尝试插入相同主键数据时未报错(说明是全新数据库);
    表现如同数据库被重新创建 → ❌ 异常。
    但通过手机文件管理器手动导出数据库文件并使用 SQLite 查看工具检查,发现其中数据实际是完整存在的。

  5. 手动干预验证
    进入系统设置 → 应用管理 → 强制停止该 App;
    或从最近任务中清除后台;
    再次手动点击 App 图标启动;
    此时数据库数据恢复正常,可查到之前写入的内容 → ✅ 恢复正常。

  6. 重复验证(可选)
    多次重启设备,问题在低端机上高频复现,高端机偶发。

预期结果:

应用在开机自启动后,必须能够正确访问并查询到之前已写入 SQLite 数据库的数据,与手动启动行为一致。

实际结果:

应用启动后查询不到历史数据,行为表现为 SQLite 数据库被重新初始化。

bug描述:

Bug 描述

在基于 UniApp 构建的 Android 应用中,当启用 开机自启动功能(通过监听 BOOT_COMPLETED 广播)或将应用配置为 Launcher 桌面类型(替换系统桌面)时,应用在启动后操作本地 SQLite 数据库(通过 plus.sqlite)偶发无法查询到此前已成功写入的数据。

具体表现为:
查询结果为空,或提示数据表不存在;
尝试插入具有相同主键的记录时未触发唯一约束冲突(说明当前操作的是一个空的新数据库);
表现如同 SQLite 数据库被重复初始化或路径错乱导致新建实例。

然而,通过手机文件管理器手动导出数据库文件(位于 _doc 目录下),并使用 SQLite 查看工具(如 DB Browser for SQLite)检查,确认原始数据实际完整存在,说明问题并非数据丢失,而是应用在特定启动方式下访问了错误的数据库路径或上下文。

该问题在资源受限的低端 Android 设备(如 1–2GB 内存、Android 8–10 系统)上复现频率显著更高;而在高端设备上偶发。
临时规避方法:进入系统设置 → 强制停止应用(或清除后台进程),再手动点击图标重新启动,此时数据库读写恢复正常。

2025-12-03 14:32 负责人:无 分享
已邀请:
用户1946233

用户1946233 (作者)

按照Ask小助手的方法进行试验还是不行

Ask小助手

Ask小助手

该问题源于Android系统在特定启动场景(开机自启动/Launcher模式)下应用上下文环境差异导致的SQLite路径识别异常。低端设备因资源限制更易触发此问题。

根本原因
当应用通过系统广播自动启动时,可能未正确初始化plus.runtime上下文,导致plus.sqlite默认使用相对路径(_doc/)时解析到错误的存储位置。手动启动时上下文完整,故数据可正常访问。

解决方案

  1. 显式指定绝对路径

    const dbPath = plus.io.convertLocalFileSystemURL('_doc/database.db');  
    const db = plus.sqlite.openDatabase({name: dbPath});  

    通过convertLocalFileSystemURL确保路径始终指向应用私有目录。

  2. 检查AndroidManifest配置

    • 确保BOOT_COMPLETED广播接收器声明正确
    • 添加android:exported="true"属性(Android 12+需显式声明)
    • 避免在广播接收器中直接操作数据库,应在主Activity初始化完成后操作
  3. 延迟数据库操作
    plusReady事件后执行数据库操作,确保运行时环境完全初始化:

    document.addEventListener('plusready', () => {  
     // 此处操作SQLite  
    }, false);  

参考文档:应用启动流程SQLite API
建议升级至HBuilderX 4.86+(最新正式版),其中包含Android平台存储相关的稳定性优化。

内容为 AI 生成,仅供参考

要回复问题请先登录注册