HarmonyOS鸿蒙Next flutter\sqflite 运行报错

HarmonyOS鸿蒙Next flutter\sqflite 运行报错 cke_248.png

在安卓上运行正常,将assert中db文件转移至getApplicationDocumentsDirectory后,判断db为isOpen状态,执行query或rawQuery时,报出以上错误。在安卓执行正常,使用DBeaver可正常链接数据库及交互sql。

运行环境:deveco内置设备管理器-模拟器

已上传:

1.hilog文件。

2.最小可复现demo工程,修改ohdemo.txt后缀为ohdemo.zip解压出工程代码。


更多关于HarmonyOS鸿蒙Next flutter\sqflite 运行报错的实战教程也可以访问 https://www.itying.com/category-92-b0.html

12 回复

开发者您好,按下述方案排查是否能解决问题,如果不可以请提供以下信息:

1.报错的完整日志(1.打开cmd 2.清除:hdc shell hilog -r 3.监听抓日志:hdc shell hilog >log.txt)。

2.能复现问题的最小demo。

【解决方案】 排查数据库访问是否存在问题,具体可以排查所查的表(t_zgjm_lib)/字段是否存在、传入的SQL语句的语法是否正确等。

更多关于HarmonyOS鸿蒙Next flutter\sqflite 运行报错的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


  1. hilog文件。

  2. 最小可复现demo工程,修改ohdemo.txt后缀为ohdemo.zip解压出工程代码。

大佬,请您帮忙看看,

数据库表不存在no such table: t_zgjm_lib

大佬,帮我看看。数据库表是存在的,在安卓上运行正常,可查询。在PC上用DBeaver也可以正常链接数据库并查询。 已上传: 1.hilog文件。 2.最小可复现demo工程,修改ohdemo.txt后缀为ohdemo.zip解压出工程代码。

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

核心错误与你之前在 Flutter 项目中遇到的“no such table: t_zgjm_lib”是两个不同层面的问题。你当前的 Flutter 代码错误(SQLITE_ERROR: no such table)是应用层的数据库操作失败,而你新上传的这份日志,是HarmonyOS 系统层的错误。

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

hilog中的错误,就是对no such table错误的复现。可能抓取的内容更多,最终返回给应用层的还是no such table。是否是模拟器不支持?,

鸿蒙Next暂不支持Flutter的sqflite插件。该插件依赖Android/iOS原生平台实现,而鸿蒙Next是纯鸿蒙内核,不兼容这些依赖。目前Flutter在鸿蒙Next上仅支持基础UI渲染,数据库等平台特定功能需等待官方适配或使用鸿蒙原生开发方式。

根据您提供的错误信息和场景,这是一个典型的HarmonyOS Next与Flutter插件sqflite的兼容性问题。错误核心在于HarmonyOS Next的安全沙箱机制与Android不同,导致数据库文件权限或路径访问异常。

主要原因分析:

  1. HarmonyOS Next应用沙箱限制:HarmonyOS Next对应用的文件访问权限有更严格的规定。getApplicationDocumentsDirectory()返回的路径在HarmonyOS上可能位于应用沙箱内,其文件权限(如chmod)与Android存在差异,导致sqflite底层通过open系统调用打开数据库文件时失败(错误码-1,通常表示权限不足或路径不可访问)。
  2. sqflite插件原生层适配问题sqflite插件在HarmonyOS Next上的原生(C/C++)实现可能未完全适配HarmonyOS的文件系统API或权限模型。错误日志中的open失败和后续的sqlite3_open_v2失败都指向了文件打开这一初始环节。

直接解决方案:

由于sqflite本身可能尚未完全适配HarmonyOS Next,建议采取以下方案:

  • 方案一:使用HarmonyOS原生数据库(推荐) 迁移至HarmonyOS原生数据库API(@ohos.data.relationalStore)。这是最稳定、性能最优的方案,能完全兼容HarmonyOS Next的安全和生命周期管理。您需要通过Flutter插件(FFI或Platform Channel)桥接调用HarmonyOS的Native API。

  • 方案二:检查并显式设置文件权限 在将数据库文件从assets复制到应用文档目录后,尝试显式设置文件权限(如果HarmonyOS的Dart IO支持)。但请注意,HarmonyOS的沙箱可能限制此类操作。

    // 复制文件后,尝试设置权限(示例,实际效果取决于HarmonyOS支持)
    await File(dbPath).setMode(0666); // 可能不可用
    
  • 方案三:使用其他兼容的SQLite插件或纯Dart实现 寻找已明确支持HarmonyOS Next的Flutter数据库插件,或考虑使用纯Dart实现的SQLite库(如moor的纯Dart版本),但性能可能受影响。

当前问题规避: 如果必须临时使用sqflite,请确认:

  1. 数据库文件是否成功复制到目标路径,且路径无中文或特殊字符。
  2. 尝试使用getApplicationSupportDirectory()getDatabasesPath()(如果插件提供)作为替代路径,看是否权限配置不同。

根本解决: 需要sqflite插件维护者更新其HarmonyOS Next的原生层代码,以正确适配文件打开接口和权限处理。您可以关注该插件的GitHub仓库,查看是否有HarmonyOS相关的Issue或PR。

由于您已提供hilog和Demo工程,这些信息有助于进一步定位原生层崩溃点。但鉴于当前插件兼容性状态,迁移至HarmonyOS原生数据库是更可靠的长期方案。

回到顶部