当前位置: 首页 > java >正文

HarmonyOSNext全栈数据存储双星解析:轻量级VS关系型存储终极指南

HarmonyOSNext全栈数据存储双星解析:轻量级VS关系型存储终极指南

##Harmony OS Next ##Ark Ts ##教育

本文适用于教育科普行业进行学习,有错误之处请指出我会修改。

🌠一招鲜吃遍天!用户首选项使用全攻略🌠


🎯场景定位:轻量存储小能手

  • 核心能力:Key-Value键值存储(像小本本记笔记一样方便!)
  • 最佳拍档:字体大小/夜间模式等个性化设置
  • 不适合:大数据存储(超过1万条会变胖哦!)、敏感数据加密
  • 🌟 必杀技:内存缓存加速 + 按需持久化(flush一下全搞定)

🚀运作三连拍

// 1️⃣ 获取实例(就像打开笔记本)
let options: preferences.Options = { name: 'myStore' };
dataPreferences = preferences.getPreferencesSync(this.context, options);// 2️⃣ 读写操作(像便利贴一样方便)
dataPreferences.putSync('darkMode', true);  // 写
let mode = dataPreferences.getSync('darkMode', false);  // 读// 3️⃣ 持久化(保存笔记)
dataPreferences.flush((err) => { /*...*/ });

⚠️使用前必读!这些坑千万别踩

雷区安全姿势
多进程使用❌ 绝对禁止!
Key超1024字节❌ 会爆!
特殊字符存储✅ 转Uint8Array保平安
并发删除操作❌ 禁止

🛠️接口速查表(常用版)

方法作用同步/异步
getPreferencesSync()获取存储实例⚡同步
putSync()写入数据⚡同步
on('change')订阅数据变化🌈异步
deletePreferences()删除实例+文件🌈异步

📝开发四部曲(附赠防秃指南)

1️⃣ 导入模块
import { preferences } from '@kit.ArkData';  // 标准起手式
2️⃣ 数据操作三连
// 写数据(覆盖写入不留情!)
dataPreferences.putSync('fontSize', 16);// 读数据(找不到就返回默认值)
let fontSize = dataPreferences.getSync('fontSize', 14);// 删数据(消失吧!)
dataPreferences.deleteSync('oldSetting');
3️⃣ 特殊字符处理
// 写入时转码
let uIntArray = new TextEncoder().encode("~!@#¥%");
dataPreferences.putSync('specialChar', uIntArray);// 读取时解码
let result = new TextDecoder().decode(uIntArray as Uint8Array);
4️⃣ 订阅数据变化
// 设置监听小秘书👂
dataPreferences.on('change', (key) => {console.log(`${key}发生变化啦!`);
});// 记得取消订阅哦!
// dataPreferences.off('change');

💡专家建议

  1. 内存优化:定期使用deletePreferencesFromCache清理不用的实例
  2. 错误处理:所有异步操作都要加err判断!
  3. 数据安全:重要数据建议双重备份(别全指望Preferences)
  4. 性能秘籍:批量操作时先修改内存实例,最后一次性flush

举个栗子🌰:

// 正确姿势✅
dataPreferences.putSync('set1', 'A');
dataPreferences.putSync('set2', 'B');
dataPreferences.flush();  // 最后统一保存// 错误姿势❌
dataPreferences.putSync('set1', 'A').flush();
dataPreferences.putSync('set2', 'B').flush();

🎉搞定!现在你已经是Preferences使用高手啦~ 遇到问题记得回来查表哦!

📚关系型数据库使用宝典:从入门到精通📚


🎯适用场景大揭秘

  • 复杂数据管家:学生档案/员工信息等关系型数据存储

  • 超能力加持:事务处理/索引优化/视图管理一应俱全

  • 不擅长领域:单条数据超过2MB(会撑破肚皮哦!)

  • 🌟

    经典案例

    • 班级管理系统(姓名+学号+成绩)
    • 企业HR系统(工号+职位+薪资)

🚀核心机制三连击

// 1️⃣ 创建数据库(搭房子🏠)
const STORE_CONFIG = {name: 'CompanyDB.db',securityLevel: relationalStore.SecurityLevel.S3
};// 2️⃣ 版本管理(智能升级🔝)
if (store.version === 1) {store.executeSql('ALTER TABLE EMPLOYEE ADD COLUMN BIRTHDAY TEXT');store.version = 2;
}// 3️⃣ 数据操作(增删改查四件套✨)
store.insert('EMPLOYEE', {NAME: 'Tony', AGE: 28});

![关系型数据库运作机制示意图]


⚠️避坑指南:数据库生存法则

危险操作安全方案
多线程写操作❌ 绝对禁止!
单次查询超5000条✅ 分批次查询保平安
特殊字符处理✅ 使用Blob类型存储
数据库迁移✅ 连带.wal/.shm文件一起搬

🔧接口速查手册

方法作用同步/异步
getRdbStore()创建数据库实例🌈异步
executeSql()执行SQL语句🌈异步
insert()插入新数据🌈异步
query()条件查询🌈异步

🛠️开发五步成诗

1️⃣ 环境搭建
import { relationalStore } from '@kit.ArkData';  // 必备开场白
2️⃣ 建表升级
// 智能版本检测(自动升级结构🆙)
if (store.version === 0) {const SQL = `CREATE TABLE IF NOT EXISTS STUDENTS (ID INTEGER PRIMARY KEY AUTOINCREMENT,NAME TEXT NOT NULL,SCORE REAL)`;store.executeSql(SQL);store.version = 1;
}
3️⃣ CRUD实战
// 插入数据
store.insert('STUDENTS', {NAME: 'Lucy', SCORE: 95.5}, (err, rowId) => {console.log(`新同学ID:${rowId}`);
});// 条件查询
let predicates = new relationalStore.RdbPredicates('STUDENTS');
predicates.greaterThan('SCORE', 90);
store.query(predicates, ['NAME', 'SCORE'], (err, resultSet) => {// 处理学霸名单...
});
4️⃣ 数据备份
// 手动备份(重要操作!)
store.backup('Backup.db', (err) => {if (!err) console.log('备份成功!');
});
5️⃣ 异常处理
// 数据库崩溃恢复
try {// 数据库操作...
} catch (err) {if (err.code == 14800011) {console.log('数据库异常,启动重建程序!');// 重建数据库逻辑...}
}

💡专家技巧锦囊

  1. 性能优化

    • 使用LIMITOFFSET分页查询
    • 复杂查询放在TaskPool中执行
    // 分页查询示例
    predicates.limit(100).offset(page * 100);
    
  2. 数据类型转换

    // Blob转Uint8Array
    const photoData = resultSet.getBlob('PHOTO') as Uint8Array;
    
  3. 事务处理

    store.beginTransaction();
    try {// 批量操作...store.commit();
    } catch (err) {store.rollback();
    }
    
  4. 内存管理

    resultSet.close(); // 用完记得关水龙头🚰
    

🚨紧急情况处理

数据库崩溃怎么办?

  1. 捕获14800011错误码
  2. 删除旧数据库
  3. 重建数据库结构
  4. 从备份恢复数据
relationalStore.deleteRdbStore(context, 'CrashDB.db', () => {// 重建数据库...
});

🎉恭喜!你已经掌握关系型数据库的精髓啦~ 遇到问题记得回来查宝典哦!

http://www.xdnf.cn/news/13539.html

相关文章:

  • Linux 复制文件到另一个文件夹方法
  • 鹰盾视频加密器播放器Win32系统播放器兼容开发的技术要点与实践指南
  • [Linux入门] Linux安装及管理程序入门指南
  • VUE2个人博客系统
  • 禁止 Windows 更新后自动重启
  • 【鸿蒙表格组件】鸿蒙ArkTS轻量级表格高效渲染组件
  • Android Compose 自定义圆形取色盘
  • vscode 保存 js 时会自动格式化,取消设置也不好使
  • 运维之十个问题--2
  • ​​P值在双侧检验中的计算方法
  • 企业常见流量异常有哪些?
  • Cambridge Pixel为警用反无人机系统(C-UAS)提供软件支持
  • Vue2数组响应式问题:Object.defineProperty不能监听数组吗
  • ES Modules 与 CommonJS 的核心区别详解
  • python的时间管理库whenever的使用
  • Office2019下载安装教程(2025最新永久方法)(附安装包)
  • 【Vue】组件及组件化, 组件生命周期
  • 【AI大模型入门指南】概念与专有名词详解 (二)
  • CSP-J 2020 入门级 第一轮 阅读程序(1)
  • 【Zephyr 系列 19】打造 BLE 模块完整 SDK:AT 命令系统 + 状态机 + NVS + OTA 一体化构建
  • 华为云Flexus+DeepSeek征文 | 基于Dify构建多语言文件翻译工作流
  • NIFI在Linux系统中的系统配置最佳实践(性能调优)
  • UE5 读取配置文件
  • 【笔记】代码开发中常用环境配置与好用工具
  • Android12 开机后桌面加载框的适配
  • 拼音分词器的配置
  • kubernetes--通俗理解Sidecar容器
  • WinHex 20.8-SR1 安装教程详细步骤+下载
  • 【AI大模型入门指南】概念与专有名词详解 (一)
  • 【算法篇】逐步理解动态规划模型6(回文串问题)