当前位置:   article > 正文

【HarmonyOS开发】ArkTs关系型和非关系型数据库的存储封装_distributedkvstore

distributedkvstore

图片

前面使用了首选项的存储方式,因此将其他的两种存储方式(键值型数据库和关系型数据库)也学习一下,简单记录一下,并进行封装,方便后续使用。

1、效果预览

2、使用条件

2.1 键值型数据库

        键值型数据库实现数据持久化width=device-width,initial-scale=1.0icon-default.png?t=N7T8http://test.openharmony.cn:7780/pages/v4.0/zh-cn/application-dev/database/data-persistence-by-kv-store.md/

  • 设备协同数据库,针对每条记录,Key的长度≤896 Byte,Value的长度<4 MB。
  • 单版本数据库,针对每条记录,Key的长度≤1 KB,Value的长度<4 MB。

  • 每个应用程序最多支持同时打开16个键值型分布式数据库。

  • 键值型数据库事件回调方法中不允许进行阻塞操作,例如修改UI组件。

2.2 关系型数据库

关系型数据库实现数据持久化width=device-width,initial-scale=1.0icon-default.png?t=N7T8http://test.openharmony.cn:7780/pages/v4.0/zh-cn/application-dev/database/data-persistence-by-rdb-store.md/

  • 系统默认日志方式是WAL(Write Ahead Log)模式,系统默认落盘方式是FULL模式。
  • 数据库中连接池的最大数量是4个,用以管理用户的读操作。

  • 为保证数据的准确性,数据库同一时间只能支持一个写操作。

  • 当应用被卸载完成后,设备上的相关数据库文件及临时文件会被自动清除。

  • ArkTS侧支持的基本数据类型:number、string、二进制类型数据、boolean。

  • 为保证插入并读取数据成功,建议一条数据不要超过2M。超出该大小,插入成功,读取失败。

3、核心API

3.1 键值型数据库

  • createKVManager(创建一个KVManager对象实例)

  • getKVStore(指定Options和storeId,创建并得到指定类型的KVStore数据库)

  • put(添加指定类型的键值对到数据库)

  • get(获取指定键的值)

  • delete(从数据库中删除指定键值的数据)

3.2 关系型数据库

  • getRdbStore(获得一个相关的RdbStore,操作关系型数据库)

  • executeSql(执行包含指定参数但不返回值的SQL语句)

  • deleteRdbStore(删除数据库)

  • insert(插入一行数据)

  • delete(从数据库中删除数据)

  • update(更新数据库中的数据)

  • query(根据指定条件查询数据库中的数据)

4、封装与调用

4.1 键值型数据库

4.1.1 封装

  1. import distributedKVStore from '@ohos.data.distributedKVStore';
  2. const BUNDLE_NAME = "dbName_tengyu"
  3. let context = getContext(this)
  4. // 数据库对象
  5. let kvManager: distributedKVStore.KVManager | undefined = undefined;
  6. // KVStore数据库
  7. let kvStore: distributedKVStore.SingleKVStore | undefined = undefined;
  8. class DistributedUtil {
  9. constructor() {
  10. this.createKeyValueDB();
  11. }
  12. async getKvManager(bundleName?: string) {
  13. const kvStoreConfig: distributedKVStore.KVManagerConfig = {
  14. context: context,
  15. bundleName: bundleName || BUNDLE_NAME
  16. };
  17. try {
  18. kvManager = distributedKVStore.createKVManager(kvStoreConfig);
  19. }
  20. catch (err) {
  21. console.error(`error:${err}`)
  22. }
  23. }
  24. // 创建并得到指定类型的KVStore数据库
  25. async createKeyValueDB(op?: distributedKVStore.Options) {
  26. if (kvManager === undefined) {
  27. this.getKvManager();
  28. }
  29. try {
  30. const options: distributedKVStore.Options = {
  31. // 当数据库文件不存在时是否创建数据库,默认为true
  32. createIfMissing: true,
  33. // 设置数据库文件是否加密,默认为false,即不加密
  34. encrypt: false,
  35. // 设置数据库文件是否备份,默认为true,即备份
  36. backup: false,
  37. // 设置数据库文件是否自动同步。默认为false,即手动同步
  38. autoSync: true,
  39. // kvStoreType不填时,默认创建多设备协同数据库
  40. kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION,
  41. // 多设备协同数据库:kvStoreType: distributedKVStore.KVStoreType.DEVICE_COLLABORATION,
  42. securityLevel: distributedKVStore.SecurityLevel.S1
  43. };
  44. kvManager.getKVStore<distributedKVStore.SingleKVStore>('storeId', op || options, (err, store: distributedKVStore.SingleKVStore) => {
  45. if (err) {
  46. console.error(`Failed to get KVStore: Code:${err.code},message:${err.message}`);
  47. return;
  48. }
  49. console.info('Succeeded in getting KVStore.');
  50. kvStore = store;
  51. });
  52. } catch (e) {
  53. console.error(`An unexpected error occurred. Code:${e.code},message:${e.message}`);
  54. }
  55. return kvStore;
  56. }
  57. // 删除指定键值的数据
  58. async deleteStoreData(key: string) {
  59. if (!kvStore) {
  60. return;
  61. }
  62. try {
  63. kvStore.delete(key, (err) => {
  64. if (err !== undefined) {
  65. console.error(`Failed to delete data. Code:${err.code},message:${err.message}`);
  66. return;
  67. }
  68. console.info('Succeeded in deleting data.');
  69. });
  70. } catch (e) {
  71. console.error(`An unexpected error occurred. Code:${e.code},message:${e.message}`);
  72. }
  73. }
  74. // 向键值数据库中插入数据
  75. async putStoreData(key: string, value: any) {
  76. if (!key || !value) {
  77. return
  78. }
  79. if(!kvStore) {
  80. kvStore = await this.createKeyValueDB();
  81. }
  82. try {
  83. kvStore.put(key, value, (err) => {
  84. if (err !== undefined) {
  85. console.error(`Failed to put data. Code:${err.code},message:${err.message}`);
  86. return;
  87. }
  88. console.info('Succeeded in putting data.');
  89. });
  90. } catch (e) {
  91. console.error(`An unexpected error occurred. Code:${e.code},message:${e.message}`);
  92. }
  93. }
  94. // 获取指定键的值
  95. async getStoreData(key: string) {
  96. if (!key) {
  97. return
  98. }
  99. if(!kvStore) {
  100. kvStore = await this.createKeyValueDB();
  101. }
  102. return new Promise((resolve, reject) => {
  103. try {
  104. kvStore.get(key, (err, data) => {
  105. if (err != undefined) {
  106. console.error(`Failed to get data. Code:${err.code},message:${err.message}`);
  107. reject(err)
  108. return;
  109. }
  110. resolve(data)
  111. });
  112. } catch (err) {
  113. reject(err)
  114. console.error('TAG', `Failed to get value, Cause: ${err}`)
  115. }
  116. });
  117. }
  118. }
  119. export default new DistributedUtil();

4.1.2 调用

  1. import distributedUtil from '../../utils/distributedStrong'
  2. // 向数据库新增数据
  3. distributedUtil.putStoreData('test0011', JSON.stringify({
  4. name: 666,
  5. age: 32,
  6. date: '2023.06.26'
  7. }))
  8. // 获取数据库中的数据
  9. distributedUtil.getStoreData('test0011').then(res => {
  10. console.log('===获取数据库中的数据====', JSON.stringify(res))
  11. })

4.2 关系型数据库

关系型数据库运作机制 

4.2.1 封装

  1. import relationalStore from '@ohos.data.relationalStore';
  2. const DB_NAME = "RelationStoreDB.db"
  3. let context = getContext(this)
  4. let store: relationalStore.RdbStore | undefined = undefined;
  5. class RelationalUtil {
  6. async getRdbStoreConfig(dbName?: string, config?: relationalStore.StoreConfig) {
  7. const STORE_CONFIG: relationalStore.StoreConfig = config || {
  8. // 数据库文件名
  9. name: dbName || DB_NAME,
  10. // 数据库安全级别
  11. securityLevel: relationalStore.SecurityLevel.S1,
  12. // 可选参数,指定数据库是否加密,默认不加密
  13. encrypt: false,
  14. };
  15. return STORE_CONFIG;
  16. }
  17. // 创建并得到指定类型的KVStore数据库
  18. async createDatabaseTable(sqlCreateTable: string) {
  19. const STORE_CONFIG = await this.getRdbStoreConfig();
  20. relationalStore.getRdbStore(context, STORE_CONFIG, (err, rdbStore: relationalStore.RdbStore) => {
  21. if (err) {
  22. console.error(`Failed to get RdbStore. Code:${err.code}, message:${err.message}`);
  23. return;
  24. }
  25. console.info('Succeeded in getting RdbStore.');
  26. // 当数据库创建时,数据库默认版本为0
  27. store = rdbStore;
  28. store.executeSql(sqlCreateTable); // 创建数据表
  29. })
  30. }
  31. // 删除数据库
  32. async deleteDB(dbName: string = DB_NAME) {
  33. relationalStore.deleteRdbStore(context, dbName, (err) => {
  34. if (err) {
  35. console.error(`Failed to delete RdbStore. Code:${err.code}, message:${err.message}`);
  36. return;
  37. }
  38. console.info('Succeeded in deleting RdbStore.');
  39. });
  40. }
  41. // 向数据库中插入数据
  42. async insertDatas(tableName: string, valueBucket) {
  43. if (store != undefined) {
  44. (store as relationalStore.RdbStore).insert(tableName, valueBucket, (err, rowId: number) => {
  45. if (err) {
  46. console.error(`Failed to insert data. Code:${err.code}, message:${err.message}`);
  47. return;
  48. }
  49. console.info(`Succeeded in inserting data. rowId:${rowId}`);
  50. })
  51. }
  52. }
  53. // 对数据进行修改
  54. async updateDatas(tableName: string, valueBucket, key, val) {
  55. let predicates = new relationalStore.RdbPredicates(tableName); // 创建表tableName的predicates
  56. predicates.equalTo(key, val); // 匹配表tableName中key为val的字段
  57. if (store != undefined) {
  58. (store as relationalStore.RdbStore).update(valueBucket, predicates, (err, rowId: number) => {
  59. if (err) {
  60. console.error(`Failed to insert data. Code:${err.code}, message:${err.message}`);
  61. return;
  62. }
  63. console.info(`Succeeded in inserting data. rowId:${rowId}`);
  64. })
  65. }
  66. }
  67. //根据谓词指定的查询条件查找数据
  68. async getDatas(tableName: string, atomArr: Array<string>, key: string, val: string | number) {
  69. let predicates = new relationalStore.RdbPredicates(tableName);
  70. predicates.equalTo(key, val);
  71. if (store != undefined) {
  72. return new Promise((resolve, reject) => {
  73. (store as relationalStore.RdbStore).query(predicates, atomArr, (err, resultSet) => {
  74. if (err) {
  75. console.error(`Failed to query data. Code:${err.code}, message:${err.message}`);
  76. reject(err);
  77. return;
  78. }
  79. resolve(resultSet);
  80. console.info(`ResultSet column names: ${resultSet.columnNames}, column count: ${resultSet.columnCount}`);
  81. })
  82. })
  83. }
  84. }
  85. }
  86. export default new RelationalUtil();

4.2.2 调用

  1. import relationalUtil from '../../utils/relationalStrong';
  2. import { ValuesBucket } from '@ohos.data.ValuesBucket';
  3. const DB_NAME = 'testDB'
  4. const TABLE_NAME = 'table1'
  5. // 建库建表
  6. const SQL_CREATE_TABLE = 'CREATE TABLE IF NOT EXISTS EMPLOYEE (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT NOT NULL, AGE INTEGER, SALARY REAL, CODES BLOB)';
  7. relationalUtil.createDatabaseTable(SQL_CREATE_TABLE, DB_NAME);
  8. // 删除数据库
  9. relationalUtil.deleteDB(DB_NAME);
  10. // 新增数据
  11. const valBucket: ValuesBucket = {
  12. 'NAME': 111,
  13. 'AGE': 222,
  14. 'SALARY': 333,
  15. 'CODES': 444,
  16. };
  17. relationalUtil.insertDatas(TABLE_NAME, valBucket);
  18. // 修改数据
  19. relationalUtil.updateDatas(TABLE_NAME, valBucket, 'NAME', 'Test001Val');
  20. // 获取数据
  21. relationalUtil.getDatas(TABLE_NAME, ['NAME', 'AGE', 'SALARY'], 'NAME', 'Test001Val');

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/294899
推荐阅读
相关标签
  

闽ICP备14008679号