鸿蒙中 数据存储位置分类
本文系统介绍了鸿蒙应用开发中的五大数据存储方案:1.应用私有文件(沙盒存储)适用于图片、音频等文件;2.Preferences(键值存储)适合用户配置等小数据,支持加密;3.关系型数据库(RDB)用于结构化数据存储;4.分布式数据服务实现跨设备同步;5.AppStorage用于全局内存状态管理。文章详细说明了各方案的API使用示例、存储位置和生命周期,并强调了数据安全措施如加密存储和权限管理。最后
·
本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
鸿蒙(HarmonyOS)应用开发中,数据存储的位置和方式根据不同的使用场景和安全需求分为多种类型。以下是鸿蒙应用数据存储的分类,包含 存储位置、适用场景、API使用 及 安全事项。
一、数据存储分类与对比
| 存储类型 | 存储位置 | 数据类型 | 生命周期 | 加密支持 |
|---|---|---|---|---|
| 应用私有文件 | /data/app/包名/files/ |
文本、二进制 | 应用卸载时删除 | 可选 |
| Preferences | 系统数据库 | 键值对(小型数据) | 应用卸载时删除 | 支持 |
| 关系型数据库 | /data/app/包名/database/ |
结构化数据 | 应用卸载时删除 | 可选 |
| 分布式数据服务 | 跨设备同步存储 | 键值对/结构化数据 | 依赖设备同步策略 | 强制加密 |
| AppStorage | 内存(全局共享) | 简单数据类型 | 应用退出时清除 | 不支持 |
二、存储示例
1. 应用私有文件(沙盒存储)
- 适用场景:保存图片、音频等私有文件。
- API:
@ohos.file.fs - 示例:写入和读取文件
import fs from '@ohos.file.fs';
// 写入文件
let dir = getContext().filesDir; // 沙盒目录
let filePath = dir + '/data.txt';
fs.writeText(filePath, 'Hello World').then(() => {
console.info('写入成功');
});
// 读取文件
fs.readText(filePath).then((content) => {
console.info('文件内容:', content);
});
路径说明:
filesDir:/data/app/包名/files/cacheDir:/data/app/包名/cache/(临时文件)
2. Preferences(轻量级键值存储)
- 适用场景:用户配置、登录令牌等小数据。
- API:
@ohos.data.preferences - 示例:加密存储
import dataPreferences from '@ohos.data.preferences';
let pref: Promise<dataPreferences.Preferences> =
dataPreferences.getPreferences(getContext(), 'userPrefs', { encrypt: true });
// 写入数据
pref.then((pref) => {
pref.put('username', 'Alice').flush();
});
// 读取数据
pref.then((pref) => {
pref.get('username', 'default').then((value) => {
console.info('用户名:', value);
});
});
3. 关系型数据库(RDB)
- 适用场景:需要复杂查询的结构化数据(如聊天记录)。
- API:
@ohos.data.relationalStore - 示例:创建表并操作数据
import relationalStore from '@ohos.data.relationalStore';
let config = {
name: 'myDB.db',
securityLevel: relationalStore.SecurityLevel.S1 // 加密级别
};
relationalStore.getRdbStore(getContext(), config, (err, store) => {
// 建表
store.executeSql(
'CREATE TABLE IF NOT EXISTS user (id INTEGER PRIMARY KEY, name TEXT)'
);
// 插入数据
store.executeSql('INSERT INTO user (name) VALUES (?)', ['Bob']);
// 查询数据
let resultSet = store.query('SELECT * FROM user');
console.info(resultSet.rowCount);
});
4. 分布式数据服务(跨设备同步)
- 适用场景:多设备间数据同步(如剪贴板、收藏夹)。
- API:
@ohos.distributedKVStore - 示例:同步键值对
import distributedKVStore from '@ohos.distributedKVStore';
let kvManager = distributedKVStore.createKVManager({
context: getContext(),
bundleName: 'com.example.app'
});
let options = {
createIfMissing: true,
encrypt: true, // 强制加密
autoSync: true // 自动同步
};
kvManager.getKVStore('syncStore', options, (err, store) => {
// 写入数据(自动同步到其他设备)
store.put('key', 'value', (err) => {
if (!err) console.info('同步成功');
});
});
5. AppStorage(全局内存状态)
- 适用场景:临时共享的全局状态(如主题、语言)。
- API:
AppStorage - 示例:
// 设置全局状态
AppStorage.SetOrCreate('theme', 'dark');
@Component
struct ThemeSwitcher {
@StorageLink('theme') theme: string;
build() {
Column() {
Text(`当前主题: ${this.theme}`)
Button('切换').onClick(() => this.theme = 'light')
}
}
}
三、数据安全与权限管理
1. 敏感数据加密
- 加密算法选择:
import cryptoFramework from '@ohos.security.crypto';
let cipher = cryptoFramework.createCipher('AES256|GCM|PKCS7');
let encrypted = cipher.doFinal('plainText', 'base64Key');
2. 权限申请
- 配置文件声明(
module.json5):
"requestPermissions": [
{
"name": "ohos.permission.READ_USER_STORAGE",
"reason": "读取用户文件"
}
]
- 动态申请:
import abilityAccessCtrl from '@ohos.abilityAccessCtrl';
let atManager = abilityAccessCtrl.createAtManager();
atManager.requestPermissionsFromUser(['ohos.permission.WRITE_USER_STORAGE']);
四、不同场景下的存储建议
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 用户个性化设置 | Preferences(加密) | 轻量级、支持加密 |
| 应用缓存图片 | 沙盒cacheDir |
可被系统自动清理 |
| 多设备共享数据 | 分布式KVStore | 自动同步、强制加密 |
| 复杂业务数据(如订单) | 关系型数据库(RDB) | 支持SQL查询 |
| 临时全局状态 | AppStorage | 内存级高速访问 |
五、常见问题
1. 如何备份应用数据?
- 方案:使用
fileioAPI将私有文件复制到公共目录(需用户授权):
fs.copy(getContext().filesDir + '/data.txt', '/storage/emulated/0/backup/data.txt');
2. 如何实现数据迁移?
- 方案:升级时通过
upgrade钩子处理旧数据:
onUpgrade(oldVersion: number) {
if (oldVersion < 2) {
migrateDataFromV1ToV2(); // 自定义迁移逻辑
}
}
3. 跨应用数据共享
- 方案:使用
DataAbility提供数据接口:
export default class MyDataAbility extends Ability {
onQuery(uri, columns, predicates, callback) {
// 返回其他应用可查询的数据
}
}
总结
应用的数据存储根据 数据类型、安全需求、生命周期 提供多种选择:
- 私有文件:大文件存储
- Preferences:加密键值对
- RDB:结构化数据
- 分布式KVStore:跨设备同步
- AppStorage:全局内存状态
更多推荐

所有评论(0)