HarmonyOS鸿蒙Next中flutter三方库适配:sqlcipher_flutter_libs

HarmonyOS鸿蒙Next中flutter三方库适配:sqlcipher_flutter_libs 【问题描述】 :flutter三方库适配鸿蒙 sqlcipher_flutter_libs,我使用的是sqlite2,需要用到这个库
sqlcipher_flutter_libs:https://pub.dev/packages/sqlcipher_flutter_libs


更多关于HarmonyOS鸿蒙Next中flutter三方库适配:sqlcipher_flutter_libs的实战教程也可以访问 https://www.itying.com/category-92-b0.html

11 回复

开发者您好,请升级sqlite2至sqllite3(3.3版本),参考文档说明升级sqllite3后无需使用sqlcipher加密。请升级后验证,如果仍然无法满足需求,请及时反馈。感谢你的理解与支持。

更多关于HarmonyOS鸿蒙Next中flutter三方库适配:sqlcipher_flutter_libs的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


如果升级sqlcipher,无法统一跨平台架构;会导致较大规模返工,如果 HarmonyOS 长期无法支持 SQLCipher,可能需要更换数据库框架、重构数据库访问层、重新设计加密方案、重写 Flutter 插件适配、修改已有数据库文件格式。对于已有项目工作量较大、风险较高、会影响项目整体进度。

升级 3.x 的话,需要升级 Flutter 版本,可能又需要适配许多。。。对于已有项目工作量较大

尊敬的开发者,您好!该功能正在规划中,还请关注后续版本,感谢您的理解与支持。

你这个场景可以按两条路线选:

  1. 如果必须兼容现有 SQLCipher 文件格式,Flutter 侧不能只加 sqlcipher_flutter_libs 就结束。这个包没有 HarmonyOS 现成原生库时,关键工作是把 SQLCipher/OpenSSL 按 ohos 目标 ABI 编成可加载的 .so,放到 ohos 原生工程里,再让 Dart FFI/插件在 HarmonyOS 侧加载这份库。也就是说,真正要适配的是 “SQLCipher native library + Flutter FFI/插件加载路径”,不是单纯改 pubspec.yaml

  2. 如果只是“本端加密存储”,不要求和 Android/iOS 的 SQLCipher db 文件互通,可以优先考虑封装 HarmonyOS 原生 relationalStore。创建 RDB 时配置合适的 securityLevel,并在 StoreConfig 里启用加密能力;注意数据库创建后加密配置不能随意切换,已有明文库要走迁移:建加密库 -> 导数据 -> 校验 -> 替换。

取舍上:跨端同一套 Flutter SQLite/SQLCipher 文件,走方案 1;只服务鸿蒙端且希望稳定上架,走方案 2 更省维护成本。无论哪条路,都建议先做一个最小样例验证:建库、用密钥打开、写入、退出进程后再次打开、错误密钥失败、升级迁移。涉及高频开库时还要避免每次页面进入都重复 open/close,最好做数据库单例或连接池管理。

开发者您好,若您期望sqlcipher_flutter_libs适配HarmonyOS,请问您是在什么样的业务场景中使用该能力,交互流程是怎样的,在哪一个环节遇到了问题?方便说明能力不满足可能带来的影响:什么时间用到?是否高频?有无三方库可以做到?若提供该能力,是否会造成大工作量返工?请您注意提供的内容不要包含您或第三方的非公开信息,如给您带来不便,敬请谅解。

原始场景:为了数据安全,对数据库进行加密,打开数据库的时候通过密钥进行数据库访问

影响:每次打开加密数据库的时候会使用,比较高频

核心分析:为什么不需要这个库?

请仔细看截图中 sqlcipher_flutter_libs 的红色警告部分:

Caution: This package relates to version 2.x of package:sqlite3, and is obsolete after upgrading. … Starting from version 0.7.0, this package no longer does anything. … update to version 3.x of package:sqlite3 instead.

这段话的意思是:

  1. 这个库是过时的(Obsolete)。
  2. 从 0.7.0 版本开始,它什么都不做(No longer does anything)。
  3. 官方推荐的做法是升级到 sqlite3 的 3.x 版本。

结论: 这个库只是一个旧版的“兼容层”,它的主要作用是帮旧版 sqlite3 插件寻找 SQLCipher 的动态库。如果你使用的是新版的 sqlite3(3.x+)和 sqflite_sqlcipher,你不需要手动引入这个库。


鸿蒙适配解决方案

要在鸿蒙上实现 SQLCipher(加密数据库)功能,你应该遵循以下路径:

方案一:使用纯 Dart/FFI 实现(推荐,最快上手)

目前 sqflite 在鸿蒙上主要通过 FFI(Foreign Function Interface)调用原生库。

  1. 移除废弃依赖pubspec.yaml 中删除 sqlcipher_flutter_libs

  2. 引入正确的依赖 你需要使用 sqlite3sqflite_sqlcipher 的新版组合。

dependencies:
  # 核心 SQLite3 FFI 接口 (版本 3.x+)
  sqlite3: ^3.0.0 
  # 支持 SQLCipher 的 Sqflite 实现
  sqflite_sqlcipher: ^3.0.0 
  1. 鸿蒙侧的原生库适配(关键步骤) 由于 sqlite3 包在 Android/iOS 上会自动下载预编译的 SQLCipher 库,但在鸿蒙(OpenHarmony)上,它找不到对应的 .so.dll 文件。 你需要做的是:
  • 编译 SQLCipher 的鸿蒙静态/动态库:你需要下载 SQLCipher 的源码,使用 NDK 针对鸿蒙的架构(arm64-v8a, x86_64 等)进行编译,生成 libsqlcipher.so(或鸿蒙特定的格式)。
  • 放入鸿蒙工程:将编译好的库放入 Flutter 工程对应的鸿蒙原生模块目录中(通常在 ohos/src/main/cpplibs 目录下)。
  • 配置 CMakeLists.txt:确保你的鸿蒙原生构建脚本能找到并链接这个库。
  1. 代码调用 使用 sqflite_sqlcipher 提供的 API,它与普通 sqflite 几乎一致,只是打开数据库时提供密码:
import 'package:sqflite_sqlcipher/sqflite.dart';

final database = await openDatabase(
  'my_db.db',
  password: 'my_secret_password', 
  version: 1,
  onCreate: (db, version) {
    // 建表
  },
);

方案二:使用鸿蒙原生的数据存储(长期推荐)

如果这是一个全新的鸿蒙项目,或者你希望获得更好的性能和系统兼容性,建议放弃 Flutter 三方库的 SQLCipher,转而使用鸿蒙原生的数据库能力。

  • RDB (Relational Database):鸿蒙系统原生的关系型数据库,基于 SQLite 增强,支持加密。
  • 适配方式
    • 编写鸿蒙原生插件(HarmonyOS Native Plugin)。
    • 在 Dart 侧通过 MethodChannel 调用鸿蒙侧的 @ohos.data.relationalStore 接口。
    • 优势:无需自己编译复杂的 SQLCipher C++ 库,直接利用系统自带的安全能力,包体积更小,性能更好。

总结建议

  1. 不要引入 sqlcipher_flutter_libs,它是废弃的。
  2. 短期解决:使用 sqlite3: ^3.x + sqflite_sqlcipher,并自己手动编译 SQLCipher 的鸿蒙原生库(.so)放入工程中供 FFI 加载。
  3. 长期解决:编写鸿蒙原生插件,直接调用鸿蒙系统的 RelationalStore,这是最稳健的鸿蒙开发方式。

sqlcipher_flutter_libs 在鸿蒙 Next 上需依赖 ArkCompiler 与 Native API 桥接。当前该库未原生支持鸿蒙,需自行将 SQLCipher 逻辑通过 NAPI 封装为 ArkTS 接口,或使用鸿蒙安全数据库能力替代。具体需查阅该库是否已有鸿蒙适配分支。

sqlcipher_flutter_libs 当前未提供 HarmonyOS Next 原生适配,其核心依赖 Android/iOS 平台的 SQLCipher 动态库,无法直接用于 OpenHarmony 环境。鸿蒙使用 NAPI 而非 JNI,需自行编译 OpenHarmony 版本的 sqlcipher.so,并基于 FFI 或 ohos 插件机制重新实现原生通道。若你在 sqflite 基础上仅需加密,可暂时考虑对 SQLite 数据库文件做文件级加密再交由普通库读写,或等待官方/社区未来支持,不建议直接移植现有 sqlcipher_flutter_libs。

回到顶部