数据存储
鸿蒙操作系统提供了多种数据存储方式,以下是详细的汇总,包括示例、优缺点对比:
- LocalStorage
- 示例:
// 创建LocalStorage实例
let storage = new LocalStorage();
// 存储数据
storage.setOrCreate('key', 'value');
// 获取数据
let value = storage.get('key');
// 删除数据
storage.delete('key');
- 优点:页面级存储,方便页面内组件状态共享,使用简单。
- 缺点:非持久化,应用退出数据丢失,读写同步阻塞,频繁操作可能影响性能,不适合存储大量数据。
- AppStorage
- 示例:
// 存储数据
AppStorage.SetOrCreate('globalKey', 'globalValue');
// 获取数据
let globalValue = AppStorage.Get('globalKey');
- 优点:全局可用,可在多个页面间共享数据,支持单向和双向绑定,数据更新时可自动通知相关组件。
- 缺点:数据存储在内存中,应用退出后数据丢失,不适合存储大量数据或需要持久化的数据。
- PersistentStorage
- 示例:
// 假设AppStorage已存在,先在AppStorage中设置数据
AppStorage.SetOrCreate('persistentKey', 'persistentValue');
// 此时数据会自动持久化到PersistentStorage
// 获取数据,可从AppStorage中获取,也可通过PersistentStorage相关接口(若有)
let persistentValue = AppStorage.Get('persistentKey');
- 优点:是AppStorage的持久化扩展,应用退出后数据依然保留,全局可访问。
- 缺点:不支持嵌套对象,不支持undefined和null,建议存储小于2KB的数据,数据类型限制较大。
- 首选项存储(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编码),不适合存储大量数据或复杂结构数据。
- 关系型数据库(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语法,适合存储大量结构化数据,支持事务操作,数据管理和查询功能强大。
- 缺点:相对复杂,对于简单数据存储略显笨重,操作比键值对存储方式繁琐。
- 键值型数据库(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等,不适合存储复杂的结构化数据,事件回调方法中不允许进行阻塞操作。
- 文件存储
- 示例:
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 | 全局可用,支持数据绑定,方便页面间数据共享 | 应用退出数据丢失,不适合大量或持久化数据存储 |
| PersistentStorage | AppStorage的持久化扩展,全局可访问 | 数据类型限制大,不支持嵌套对象等 |
| 首选项存储(Preferences) | 轻量级,键值对存储,访问速度快 | 仅支持本地存储,数据长度有限制 |
| 关系型数据库(RelationalStore) | 支持SQL语法,适合结构化数据,支持事务 | 相对复杂,对于简单数据存储繁琐 |
| 键值型数据库(KV - Store) | 支持分布式数据同步,轻量级,使用简单 | 有数据长度限制,不适合复杂结构化数据 |
| 文件存储 | 可存储任意类型和大小数据,适合大文件和非结构化数据 | 需处理路径和权限,数据查询和管理不便 |