Skip to main content

数据存储

鸿蒙操作系统提供了多种数据存储方式,以下是详细的汇总,包括示例、优缺点对比:

  1. LocalStorage
    • 示例
// 创建LocalStorage实例
let storage = new LocalStorage();
// 存储数据
storage.setOrCreate('key', 'value');
// 获取数据
let value = storage.get('key');
// 删除数据
storage.delete('key');
  • 优点:页面级存储,方便页面内组件状态共享,使用简单。
  • 缺点:非持久化,应用退出数据丢失,读写同步阻塞,频繁操作可能影响性能,不适合存储大量数据。
  1. AppStorage
    • 示例
// 存储数据
AppStorage.SetOrCreate('globalKey', 'globalValue');
// 获取数据
let globalValue = AppStorage.Get('globalKey');
  • 优点:全局可用,可在多个页面间共享数据,支持单向和双向绑定,数据更新时可自动通知相关组件。
  • 缺点:数据存储在内存中,应用退出后数据丢失,不适合存储大量数据或需要持久化的数据。
  1. PersistentStorage
    • 示例
// 假设AppStorage已存在,先在AppStorage中设置数据
AppStorage.SetOrCreate('persistentKey', 'persistentValue');
// 此时数据会自动持久化到PersistentStorage
// 获取数据,可从AppStorage中获取,也可通过PersistentStorage相关接口(若有)
let persistentValue = AppStorage.Get('persistentKey');
  • 优点:是AppStorage的持久化扩展,应用退出后数据依然保留,全局可访问。
  • 缺点:不支持嵌套对象,不支持undefined和null,建议存储小于2KB的数据,数据类型限制较大。
  1. 首选项存储(Preferences)
    • 示例
import Preferences from '@ohos.data.preferences';

// 创建Preferences实例
let preference = await Preferences.createPreferences({
name: 'config_preference'
});
// 存储数据
await preference.putString('theme', 'dark');
await preference.flush();
// 获取数据
let theme = await preference.getString('theme', 'light');
  • 优点:基于键值对,轻量级,访问速度快,存取效率高,适合存储少量配置信息和用户偏好设置。
  • 缺点:仅支持本地存储,Key长度有限制(不超过80字节),Value为string时长度也有限制(不超过8192字节UTF - 8编码),不适合存储大量数据或复杂结构数据。
  1. 关系型数据库(RelationalStore)
    • 示例
import rdb from '@ohos.data.rdb';

// 数据库配置
let config = {
name: 'test.db',
version: 1
};
// 获取数据库实例
let store = await rdb.getRdbStore(config);
// 创建表
let createTableSql = 'CREATE TABLE IF NOT EXISTS notes (id INTEGER PRIMARY KEY AUTOINCREMENT, content TEXT)';
await store.executeSql(createTableSql);
// 插入数据
let insertSql = 'INSERT INTO notes (content) VALUES (?)';
let params = ['This is a note'];
await store.executeSql(insertSql, params);
// 查询数据
let querySql = 'SELECT * FROM notes';
let resultSet = await store.query(querySql);
while (resultSet.goToNextRow()) {
let content = resultSet.getString(resultSet.getColumnIndex('content'));
console.log(content);
}
  • 优点:基于SQLite,支持完整的SQL语法,适合存储大量结构化数据,支持事务操作,数据管理和查询功能强大。
  • 缺点:相对复杂,对于简单数据存储略显笨重,操作比键值对存储方式繁琐。
  1. 键值型数据库(KV - Store)
    • 示例
import distributedData from '@ohos.data.distributedData';

let options = {
bundleName: 'com.example.myapp',
kvStoreType: distributedData.KvStoreType.SINGLE_VERSION
};
const kvManager = distributedData.createKvManager(options);
kvManager.getKvStore('myStore')
.then((store: distributedData.KvStore) => {
// 存储数据
store.put('key', 'value');
// 获取数据
store.get('key').then((value) => {
console.log(value);
});
});
  • 优点:分布式键值数据库,支持跨设备数据同步,非关系型,比关系型数据库更轻量,使用简单。
  • 缺点:有数据长度限制,如Key长度≤896Byte,Value长度<4MB等,不适合存储复杂的结构化数据,事件回调方法中不允许进行阻塞操作。
  1. 文件存储
    • 示例
import fileio from '@ohos.fileio';

// 写入文件
let content = 'This is a test file content';
let fileDescriptor = await fileio.open('/data/user/0/com.example.myapp/files/test.txt', fileio.OpenMode.WriteOnly | fileio.OpenMode.CreateNew);
await fileio.write(fileDescriptor, Buffer.from(content));
await fileio.flush(fileDescriptor);
await fileio.close(fileDescriptor);

// 读取文件
let readFileDescriptor = await fileio.open('/data/user/0/com.example.myapp/files/test.txt', fileio.OpenMode.ReadOnly);
let buffer = new Uint8Array(1024);
let bytesRead = await fileio.read(readFileDescriptor, buffer);
let readContent = String.fromCharCode.apply(null, buffer.subarray(0, bytesRead));
await fileio.close(readFileDescriptor);
console.log(readContent);
  • 优点:可以存储任意类型和大小的数据,适合存储大文件和非结构化数据,如图片、音频等,支持分布式文件共享。
  • 缺点:需要处理文件路径和权限问题,读写操作相对复杂,不适合频繁的小数据读写,数据查询和管理不便。

各存储方式的优缺点对比如下:

存储方式优点缺点
LocalStorage页面级存储,方便组件状态共享,使用简单非持久化,读写同步阻塞,不适合大量数据存储
AppStorage全局可用,支持数据绑定,方便页面间数据共享应用退出数据丢失,不适合大量或持久化数据存储
PersistentStorageAppStorage的持久化扩展,全局可访问数据类型限制大,不支持嵌套对象等
首选项存储(Preferences)轻量级,键值对存储,访问速度快仅支持本地存储,数据长度有限制
关系型数据库(RelationalStore)支持SQL语法,适合结构化数据,支持事务相对复杂,对于简单数据存储繁琐
键值型数据库(KV - Store)支持分布式数据同步,轻量级,使用简单有数据长度限制,不适合复杂结构化数据
文件存储可存储任意类型和大小数据,适合大文件和非结构化数据需处理路径和权限,数据查询和管理不便