RelationalStoreUtis.ets 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. import { relationalStore } from '@kit.ArkData';
  2. import { Context } from '@ohos.abilityAccessCtrl';
  3. import { BusinessError } from '@kit.BasicServicesKit';
  4. import { rDbSql } from '../sqls/RDBSql';
  5. export interface CloudLoadItem {
  6. uid: string,
  7. date: string,
  8. jsonDataPath: string,
  9. lastRequestTime: number
  10. }
  11. export class RelationalStoreUtils {
  12. private static cloudLoadStore: relationalStore.RdbStore | undefined = undefined;
  13. //初始化数据库
  14. static initReplayCloudStore(context: Context, success?: () => void) {
  15. const REPLAY_CLOUD_STORE_CONFIG: relationalStore.StoreConfig = {
  16. name: 'YT_HM.db', // 数据库文件名
  17. securityLevel: relationalStore.SecurityLevel.S3, // 数据库安全级别
  18. encrypt: false, // 可选参数,指定数据库是否加密,默认不加密
  19. customDir: 'customDir/subCustomDir', // 可选参数,数据库自定义路径。数据库将在如下的目录结构中被创建:context.databaseDir + '/rdb/' + customDir,其中context.databaseDir是应用沙箱对应的路径,'/rdb/'表示创建的是关系型数据库,customDir表示自定义的路径。当此参数不填时,默认在本应用沙箱目录下创建RdbStore实例。
  20. isReadOnly: false // 可选参数,指定数据库是否以只读方式打开。该参数默认为false,表示数据库可读可写。该参数为true时,只允许从数据库读取数据,不允许对数据库进行写操作,否则会返回错误码801。
  21. };
  22. // 假设当前数据库版本为3,表结构:EMPLOYEE (NAME, AGE, SALARY, CODES, IDENTITY)
  23. relationalStore.getRdbStore(context, REPLAY_CLOUD_STORE_CONFIG, (err, store) => {
  24. if (err) {
  25. console.error(`Failed to get RdbStore. Code:${err.code}, message:${err.message}`);
  26. return;
  27. }
  28. // 当数据库创建时,数据库默认版本为0
  29. if (store.version === 0) {
  30. try {
  31. Object.keys(rDbSql).forEach((key) => {
  32. store.executeSync(rDbSql[key])
  33. })
  34. } catch (error) {
  35. console.error('Failed to create table:', error);
  36. }
  37. // 设置数据库的版本,入参为大于0的整数
  38. store.version = 3;
  39. }
  40. success?.()
  41. RelationalStoreUtils.cloudLoadStore = store;
  42. })
  43. }
  44. static getStore() {
  45. return RelationalStoreUtils.cloudLoadStore;
  46. }
  47. /**
  48. * 插入数据
  49. * @param tableName
  50. * @param param
  51. * @param success
  52. */
  53. static insert(tableName: string, param: ESObject, success?: () => void) {
  54. const insertParam: relationalStore.ValuesBucket = {};
  55. if (param) {
  56. Object.keys(param).forEach((key) => {
  57. insertParam[key] = param[key];
  58. })
  59. }
  60. if (RelationalStoreUtils.cloudLoadStore !== undefined) {
  61. (RelationalStoreUtils.cloudLoadStore as relationalStore.RdbStore).insert(tableName, insertParam,
  62. (err: BusinessError, rowId: number) => {
  63. if (err) {
  64. console.error(`Failed to insert data. Code:${err.code}, message:${err.message}`);
  65. return;
  66. }
  67. success?.();
  68. console.info(`Succeeded in inserting data. rowId:${rowId}`);
  69. })
  70. }
  71. }
  72. /**
  73. * 根据id更新数据
  74. * @param tableName
  75. * @param param
  76. * @param success
  77. */
  78. static updateItemById(tableName: string, param: ESObject, success?: () => void) {
  79. const updateParam: relationalStore.ValuesBucket = {};
  80. Object.keys(param).forEach((key) => {
  81. updateParam[key] = param[key];
  82. })
  83. let predicates = new relationalStore.RdbPredicates(tableName);
  84. predicates = predicates.equalTo("id", updateParam.id)
  85. if (RelationalStoreUtils.cloudLoadStore !== undefined) {
  86. (RelationalStoreUtils.cloudLoadStore as relationalStore.RdbStore).update(updateParam, predicates,
  87. (err: BusinessError, rows: number) => {
  88. if (err) {
  89. console.error(`Updated failed, code is ${err.code},message is ${err.message}`);
  90. return;
  91. }
  92. success?.();
  93. console.info(`Updated row count: ${rows}`);
  94. })
  95. }
  96. }
  97. /**
  98. * 查询列表
  99. * @param tableName
  100. * @param queryParam
  101. * @returns
  102. */
  103. static getList<T = ESObject>(tableName: string, queryParam?: ESObject): T[] {
  104. const list: T[] = []
  105. let predicates = new relationalStore.RdbPredicates(tableName);
  106. let keys: string[] = []
  107. if (queryParam) {
  108. keys = Object.keys(queryParam);
  109. }
  110. if (RelationalStoreUtils.cloudLoadStore != undefined) {
  111. // 正确拼接查询条件
  112. // if (keys.length > 0) {
  113. // predicates = predicates.equalTo(keys[0], queryParam[keys[0]]);
  114. // for (let i = 1; i < keys.length; i++) {
  115. // predicates = predicates.and().equalTo(keys[i], queryParam[keys[i]]);
  116. // }
  117. // }
  118. //朝毅高级写法
  119. if (keys.length > 0) {
  120. predicates = keys.slice(1).reduce(
  121. (pred, key) => pred.and().equalTo(key, queryParam[key]),
  122. predicates.equalTo(keys[0], queryParam[keys[0]])
  123. );
  124. }
  125. const resultSet = (RelationalStoreUtils.cloudLoadStore as relationalStore.RdbStore).querySync(predicates)
  126. // 获取列名信息
  127. const columnNames = resultSet.columnNames
  128. while (resultSet.goToNextRow()) {
  129. const item: ESObject = {}
  130. columnNames.forEach((columnName) => {
  131. // 根据列类型获取值
  132. const columnIndex = resultSet.getColumnIndex(columnName);
  133. // 可以根据需要处理不同数据类型
  134. item[columnName] = resultSet.getValue(columnIndex);
  135. })
  136. list.push(item as T);
  137. }
  138. resultSet.close();
  139. }
  140. return list;
  141. }
  142. /**
  143. * 查询单个数据
  144. * @param tableName
  145. * @param queryParam
  146. * @returns
  147. */
  148. static getItemById<T = ESObject>(tableName: string, queryParam: ESObject) {
  149. const keys = Object.keys(queryParam);
  150. const item: ESObject = {}
  151. let predicates = new relationalStore.RdbPredicates(tableName);
  152. if (RelationalStoreUtils.cloudLoadStore != undefined) {
  153. //高级写法
  154. if (keys.length > 0) {
  155. predicates = keys.slice(1).reduce(
  156. (pred, key) => pred.and().equalTo(key, queryParam[key]),
  157. predicates.equalTo(keys[0], queryParam[keys[0]])
  158. );
  159. }
  160. const resultSet = (RelationalStoreUtils.cloudLoadStore as relationalStore.RdbStore).querySync(predicates)
  161. // 获取列名信息
  162. const columnNames = resultSet.columnNames
  163. // resultSet是一个数据集合的游标,默认指向第-1个记录,有效的数据从0开始。
  164. while (resultSet.goToNextRow()) {
  165. columnNames.forEach((columnName) => {
  166. // 根据列类型获取值
  167. const columnIndex = resultSet.getColumnIndex(columnName);
  168. // 可以根据需要处理不同数据类型
  169. item[columnName] = resultSet.getValue(columnIndex);
  170. })
  171. break
  172. }
  173. // 释放数据集的内存,若不释放可能会引起fd泄露与内存泄露
  174. resultSet.close();
  175. }
  176. return item as T;
  177. }
  178. /**
  179. * 根据id删除数据
  180. * @param tableName
  181. * @param queryParam
  182. * @param success
  183. */
  184. static deleteItemById(tableName: string, id: number, success?: () => void) {
  185. let predicates = new relationalStore.RdbPredicates(tableName);
  186. predicates = predicates.equalTo("id", id)
  187. if (RelationalStoreUtils.cloudLoadStore !== undefined) {
  188. const flag = (RelationalStoreUtils.cloudLoadStore as relationalStore.RdbStore).deleteSync(predicates)
  189. if (flag != 0) {
  190. return true
  191. }
  192. }
  193. return false
  194. }
  195. }