本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

鸿蒙(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(全局内存状态)
  • 适用场景:临时共享的全局状态(如主题、语言)。
  • APIAppStorage
  • 示例
  // 设置全局状态
  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. 如何备份应用数据?
  • 方案:使用fileio API将私有文件复制到公共目录(需用户授权):
  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:全局内存状态

 

 

 

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐