harmonyos中持久化结构化数据必须用rdb而非preferences;初始化rdbstore需带.db后缀、设s1安全等级并立即建表;crud操作须严格遵循sqlite语法与api规范,注意游标初始化和资源释放。

在 HarmonyOS 应用中持久化结构化数据,比如用户信息、订单记录或账单明细,必须用 RDB 关系型数据库而非 Preferences——后者只适合存开关、主题、字体大小这类轻量配置。
初始化 RdbStore 实例
第一步是获取可操作的数据库句柄,这一步失败后续所有 CRUD 都无法进行。
调用 relationalStore.getRdbStore() 并传入 Context 和 StoreConfig;【StoreConfig 中的 name 字段必须带 .db 后缀,否则真机上会创建失败且无明确报错】。
安全等级建议设为 SecurityLevel.S1,S2/S3 需额外申请权限且调试阶段易触发加密密钥不匹配错误。
拿到 rdbStore 后立即执行建表 SQL,不要等到插入时才建——SQLite 不支持“不存在则自动建表”的懒加载机制。
创建数据表
使用 rdbStore.executeSql() 执行建表语句,SQL 必须严格遵循 SQLite 语法。
方法一:手写完整建表语句
CREATE TABLE IF NOT EXISTS user (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, created_time INTEGER DEFAULT (strftime('%s','now')))
注意:PRIMARY KEY 必须显式声明,AUTOINCREMENT 仅对 INTEGER 类型生效;TEXT 字段不能加长度限制(如 TEXT(20) 是非法语法)。
方法二:用字符串模板拼接字段
先定义字段数组 ['id INTEGER PRIMARY KEY AUTOINCREMENT', 'name TEXT', 'age INTEGER'],再用 .join(', ') 组合成列定义,避免手敲时漏掉逗号或空格。
插入数据
第一步:构造 ValuesBucket 对象,键名必须与表字段完全一致(区分大小写),值类型需匹配 SQLite 类型约束。
第二步:调用 rdbStore.insert('user', valuesBucket),返回新记录的 rowId(即主键值)。
第三步:检查返回值是否为 -1 ——这是唯一标识插入失败的信号,此时 err 参数可能为空,不能只依赖 try/catch 判定成功与否。
这一步操作起来很简单,直接把文件拖进去就行。
查询数据
① 创建 RdbPredicates 实例并指定表名:new relationalStore.RdbPredicates('user')。
② 链式添加条件:如 .greaterThan('age', 18).orderByAsc('name'),注意条件方法名是英文全称,不是缩写(gt() 无效)。
③ 调用 rdbStore.query(predicates, ['id', 'name']),第二个参数是字段白名单,传空数组会查全部字段但性能下降明显。
④ 遍历 ResultSet 时必须调用 goToFirstRow() 初始化游标位置,否则 hasNext() 永远返回 false。
查询结果必须手动关闭:resultSet.close(),否则内存泄漏会在长时间运行后导致应用卡死。
更新与删除
更新用 rdbStore.update(),传入 ValuesBucket 和 RdbPredicates,不要试图用 SQL UPDATE 字符串——RDB API 不接受原始 SQL 更新语句。
删除用 rdbStore.delete(),同样只接受 RdbPredicates 作为条件,【不传条件将清空整张表,且不可撤销】。
批量删除超过 1000 条记录时,务必分页执行(每批 ≤500 条),否则在低端设备上可能触发 ANR。











