数据存储
1、数据存储概述
数据存储是为了解决应用数据持久化问题,使得数据能够存储在外存中,达到保存或共享目的。
鸿蒙应用数据存储包括本地数据存储和分布式数据存储:
- 本地数据存储为应用提供了单设备上数据存储和访问能力。
作为操作系统,HarmonyOS支持文件存储,并在此基础上提供了基于文件的首选项数据存储。HarmonyOS底层采用SQLite数据库管理系统作为持久化存储引擎,为应用提供关系型数据存储。 - 分布式数据存储支持跨设备之间的数据共享和同步等。
鸿蒙分布式数据服务(DDS)为应用程序提供了不同设备间数据库数据分布存储能力方便应用程序数据在不同终端设备间的无缝衔接。分布式数据存储是鸿蒙系统的特色之一。
2、首选项数据存储
作为操作系统,HarmonytOS支持文件存储,并在此基础上提供了基于文件的首选项数据存储接口,首选项数据以键值对的方式进行存储,适合存储少量数据。
2.1 首选项数据存储介绍
-
首选项数据存储也称为偏好数据存储或轻量级数据存储,适合于少量的数据存储,如:登录账户密码、配置信息等。
-
首选项数据存储具有访问速度快,存取效率高的特点。
-
首选项数据存储数据最终是存储在操作系统的文件中的,系统提供对底层文件读写的封装,并把底层文件映射成Preferences实例对象。
-
首选项数据库存储的访问机制,每一个底层文件对应一个Preferences实例,应用可以借助Preferences提供的接口方法,进行读写数据
-
鸿蒙首选项数据存储采用的是键值对(Key-Value)结构进行数据存取操作的,同一个键在存储文件中只会对应一个值。对于存取的键值对。
-
要求Key为字符串(String)类型,且长度为不超过80个字符的非空字符串。Value可以为整型、字符串型、布尔型、浮点型、长整型、字符串型Set集合,当值为字符串(String)类型或字符串型Set集合时,其值长度不能超过8192个字符。
-
首选项数据存储在进行数据操作时是基于键进行的,因此一般不适合大批量数据存取,一般建议万条级别以下。
2.2 首选项数据存储接口
-
在API 9的ohos.data.preferences包中提供了获得、删除Preferences实例的函数接口,每个功能接口都提供了两种方式
-
在获得Preferences实例后,可以通过接口方法进行数据管理操作,Preferences类为首选项数据存储提供的主要接口
3、关系型数据库
- 关系型数据库(Relational Database,RDB)是基于关系模型组织管理数据的数据库。关系型数据库中一般包含若干个二维的数据表,每个表中以行和列的形式存储数据。
- 鸿蒙关系型数据存储底层使用SQLite作为持久化存储引擎,支持SQLite的所有数据库特性,包括事务、索引、视图、触发器、外键、参数化查询和预编译SQL语句等。
- 鸿蒙关系型数据存储框架实现了对底层SQLite数据进一步封装,对上层提供通用、完善且高效操作接口,包括一系列的增、删、改、查等。
3.1 初始化数据库
- 导入关系型数据库模块
import relationalStore from '@ohos.data.relationalStore';
- 初始化数据库表
//2.1 rqb配置
const config = {
name: 'MyApplication.db',// 数据库文件名
securityLevel: relationalStore.SecurityLevel.S1// 数据库安全级别
}
//2.2 初始化表的SQL
const sql = `CREARE TABLE IF NOT EXISTS TASK (
ID INTEGER PRIMARY KEY,
NAME TEXT NOT NULL,
FINISHED bit
)`
//2.3 获取rdb
relationalStore.getRdbStore(this.context, config,(err,edbStore) => {
//2.4 执行qsl,后续的所有增删改查都是使用qdbStore对象
edbStore.executeSql(sql)
})
- 关系型数据库操作接口及说明
- RdbStore类提供了数据操作的增、删、改、查接口
3.2 增、删、改数据
- 新增数据
//1.1 准备数据
let task = {id: 1, name: '任务1', finished: fasle};
//1.2 新增
this.rdbStore.insert(this.tableName, task)
- 修改
//2.1 要更新的数据
let task = {'finished': true};
//2.2 查询条件, RdbPredicates就是条件谓词
let predicates = new relationalStore.RdbPredicates(this.tableName)
predicates.equalTo('ID', id)
//2.3 执行更新
this.rdbStore.update(task, predicates)
- 删除
//3.1 查询条件
let predicates = new relationalStore.RdbPredicates(this.tableName)
predicates.equalTo('ID', id)
//3.2 只修改删除
this.rdbStore.delete(predicates)
3.3 查询数据
- 查询数据
//1.1 查询条件
let predicates = new relationalStore.RdbPredicates(this.tableName)
//1.2 执行查询
let result = await this.rdbStore.query(predicates,['ID','NAME','FINISHED'])
- 解析结构
//2.1 准备数组保存结果
let tasks: any[] = []
//2.2 循环遍历结果集,判断是否结果是否遍历导最后一行
while(!result.isAtLastRow){
//指针移动到下一行数据
result.goToNextRow()
//根据字段名获取字段index,从而获取字段值
let id = result.getLong(result.getColumnIndex('ID'));
let name = result.getLong(result.getColumnIndex('NAME'));
tasks.push({id, name})
}
列表中,指针指到哪一行,就读取哪一行的数据,指针初始位置为指向-1。通过while循环,将每一行的数据传入数组中,直至查询到最后一行,拿到所有结果。