RelationalStoreUtis.ts 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  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, isDeBug: boolean = false) {
  15. let securityLevel: relationalStore.SecurityLevel = relationalStore.SecurityLevel.S3
  16. // 在 debug模式下,数据库安全级别为S1。 确保数据库可视化工具可以正常访问
  17. if (isDeBug) {
  18. securityLevel = relationalStore.SecurityLevel.S1
  19. }
  20. const REPLAY_CLOUD_STORE_CONFIG: relationalStore.StoreConfig = {
  21. name: 'YT_HM.db', // 数据库文件名
  22. securityLevel: securityLevel, // 数据库安全级别
  23. encrypt: false, // 可选参数,指定数据库是否加密,默认不加密
  24. customDir: 'customDir/subCustomDir', // 可选参数,数据库自定义路径。数据库将在如下的目录结构中被创建:context.databaseDir + '/rdb/' + customDir,其中context.databaseDir是应用沙箱对应的路径,'/rdb/'表示创建的是关系型数据库,customDir表示自定义的路径。当此参数不填时,默认在本应用沙箱目录下创建RdbStore实例。
  25. isReadOnly: false // 可选参数,指定数据库是否以只读方式打开。该参数默认为false,表示数据库可读可写。该参数为true时,只允许从数据库读取数据,不允许对数据库进行写操作,否则会返回错误码801。
  26. };
  27. // 假设当前数据库版本为3,表结构:EMPLOYEE (NAME, AGE, SALARY, CODES, IDENTITY)
  28. relationalStore.getRdbStore(context, REPLAY_CLOUD_STORE_CONFIG, (err, store) => {
  29. if (err) {
  30. console.error(`Failed to get RdbStore. Code:${err.code}, message:${err.message}`);
  31. return;
  32. }
  33. // 当数据库创建时,数据库默认版本为0
  34. if (store.version === 0) {
  35. try {
  36. Object.keys(rDbSql).forEach((key) => {
  37. store.executeSync(rDbSql[key])
  38. })
  39. } catch (error) {
  40. console.error('Failed to create table:', error);
  41. }
  42. // 设置数据库的版本,入参为大于0的整数
  43. store.version = 3;
  44. }
  45. RelationalStoreUtils.cloudLoadStore = store;
  46. success?.()
  47. })
  48. }
  49. static getStore() {
  50. return RelationalStoreUtils.cloudLoadStore;
  51. }
  52. /**
  53. * 插入数据 --id不用传,数据库自增
  54. * @param table 对呀的哪张表
  55. * @param param
  56. * @param success
  57. */
  58. static insert<T>(table: new () => T, param: ESObject, success?: (id: number) => void) {
  59. // 添加参数校验
  60. if (!table || !table.name) {
  61. console.error('Invalid table constructor provided');
  62. return;
  63. }
  64. const insertParam: relationalStore.ValuesBucket = {};
  65. if (param) {
  66. Object.keys(param).forEach((key) => {
  67. insertParam[key] = param[key];
  68. })
  69. }
  70. if (RelationalStoreUtils.cloudLoadStore !== undefined) {
  71. (RelationalStoreUtils.cloudLoadStore as relationalStore.RdbStore).insert(table.name, insertParam,
  72. (err: BusinessError, rowId: number) => {
  73. if (err) {
  74. console.error(`Failed to insert data. Code:${err.code}, message:${err.message}`);
  75. return;
  76. }
  77. success?.(rowId);
  78. console.info(`Succeeded in inserting data. rowId:${rowId}`);
  79. })
  80. }
  81. }
  82. /**
  83. * 插入数据 --id不用传,数据库自增
  84. * @param table 对呀的哪张表
  85. * @param param
  86. * @param success 返回插入后的id
  87. */
  88. static insertSync<T>(table: new () => T, param: ESObject) {
  89. let id = -1
  90. // 添加参数校验
  91. if (!table || !table.name) {
  92. console.error('Invalid table constructor provided');
  93. return;
  94. }
  95. const insertParam: relationalStore.ValuesBucket = {};
  96. if (param) {
  97. Object.keys(param).forEach((key) => {
  98. insertParam[key] = param[key];
  99. })
  100. }
  101. if (RelationalStoreUtils.cloudLoadStore !== undefined) {
  102. id = (RelationalStoreUtils.cloudLoadStore as relationalStore.RdbStore).insertSync(table.name, insertParam)
  103. }
  104. return id
  105. }
  106. /**
  107. * 根据id更新数据
  108. * @param tableName
  109. * @param param
  110. * @param success
  111. */
  112. static updateItemById<T>(table: new () => T, param: ESObject, success?: () => void) {
  113. const updateParam: relationalStore.ValuesBucket = {};
  114. Object.keys(param).forEach((key) => {
  115. updateParam[key] = param[key];
  116. })
  117. let predicates = new relationalStore.RdbPredicates(table.name);
  118. predicates = predicates.equalTo("id", updateParam.id)
  119. if (RelationalStoreUtils.cloudLoadStore !== undefined) {
  120. (RelationalStoreUtils.cloudLoadStore as relationalStore.RdbStore).update(updateParam, predicates,
  121. (err: BusinessError, rows: number) => {
  122. if (err) {
  123. console.error(`Updated failed, code is ${err.code},message is ${err.message}`);
  124. return;
  125. }
  126. success?.();
  127. console.info(`Updated row count: ${rows}`);
  128. })
  129. }
  130. }
  131. /**
  132. * 根据id更新数据
  133. * @param tableName
  134. * @param param
  135. * @param success
  136. */
  137. static updateItemByIdSync<T>(table: new () => T, param: ESObject) {
  138. const updateParam: relationalStore.ValuesBucket = {};
  139. Object.keys(param).forEach((key) => {
  140. updateParam[key] = param[key];
  141. })
  142. let predicates = new relationalStore.RdbPredicates(table.name);
  143. predicates = predicates.equalTo("id", updateParam.id)
  144. if (RelationalStoreUtils.cloudLoadStore !== undefined) {
  145. (RelationalStoreUtils.cloudLoadStore as relationalStore.RdbStore).updateSync(updateParam, predicates)
  146. }
  147. }
  148. /**
  149. * 查询列表
  150. * @param tableName
  151. * @param queryParam
  152. * @returns
  153. */
  154. static getListSync<T = ESObject>(table: new () => T, queryParam?: ESObject): T[] {
  155. const list: T[] = []
  156. let predicates = new relationalStore.RdbPredicates(table.name);
  157. let keys: string[] = []
  158. if (queryParam) {
  159. keys = Object.keys(queryParam);
  160. }
  161. if (RelationalStoreUtils.cloudLoadStore != undefined) {
  162. // 正确拼接查询条件
  163. // if (keys.length > 0) {
  164. // predicates = predicates.equalTo(keys[0], queryParam[keys[0]]);
  165. // for (let i = 1; i < keys.length; i++) {
  166. // predicates = predicates.and().equalTo(keys[i], queryParam[keys[i]]);
  167. // }
  168. // }
  169. //朝毅高级写法
  170. if (keys.length > 0) {
  171. predicates = keys.slice(1).reduce(
  172. (pred, key) => pred.and().equalTo(key, queryParam[key]),
  173. predicates.equalTo(keys[0], queryParam[keys[0]])
  174. );
  175. }
  176. const resultSet = (RelationalStoreUtils.cloudLoadStore as relationalStore.RdbStore).querySync(predicates)
  177. // 获取列名信息
  178. const columnNames = resultSet.columnNames
  179. while (resultSet.goToNextRow()) {
  180. const item: ESObject = {}
  181. columnNames.forEach((columnName) => {
  182. // 根据列类型获取值
  183. const columnIndex = resultSet.getColumnIndex(columnName);
  184. // 可以根据需要处理不同数据类型
  185. item[columnName] = resultSet.getValue(columnIndex);
  186. })
  187. list.push(item as T);
  188. }
  189. resultSet.close();
  190. }
  191. return list;
  192. }
  193. /**
  194. * 查询单个数据
  195. * @param tableName
  196. * @param queryParam
  197. * @returns
  198. */
  199. static getItemByIdSync<T = ESObject>(table: new () => T, queryParam: ESObject) {
  200. const keys = Object.keys(queryParam);
  201. const item: ESObject = {}
  202. let predicates = new relationalStore.RdbPredicates(table.name);
  203. if (RelationalStoreUtils.cloudLoadStore != undefined) {
  204. //高级写法
  205. if (keys.length > 0) {
  206. predicates = keys.slice(1).reduce(
  207. (pred, key) => pred.and().equalTo(key, queryParam[key]),
  208. predicates.equalTo(keys[0], queryParam[keys[0]])
  209. );
  210. }
  211. const resultSet = (RelationalStoreUtils.cloudLoadStore as relationalStore.RdbStore).querySync(predicates)
  212. // 获取列名信息
  213. const columnNames = resultSet.columnNames
  214. // resultSet是一个数据集合的游标,默认指向第-1个记录,有效的数据从0开始。
  215. while (resultSet.goToNextRow()) {
  216. columnNames.forEach((columnName) => {
  217. // 根据列类型获取值
  218. const columnIndex = resultSet.getColumnIndex(columnName);
  219. // 可以根据需要处理不同数据类型
  220. item[columnName] = resultSet.getValue(columnIndex);
  221. })
  222. break
  223. }
  224. // 释放数据集的内存,若不释放可能会引起fd泄露与内存泄露
  225. resultSet.close();
  226. }
  227. return item as T;
  228. }
  229. /**
  230. * 根据id删除数据
  231. * @param tableName
  232. * @param queryParam
  233. * @param success
  234. */
  235. static deleteItemById<T>(table: new () => T, id: number, success?: () => void) {
  236. let predicates = new relationalStore.RdbPredicates(table.name);
  237. predicates = predicates.equalTo("id", id)
  238. if (RelationalStoreUtils.cloudLoadStore !== undefined) {
  239. (RelationalStoreUtils.cloudLoadStore as relationalStore.RdbStore).delete(predicates,
  240. (err: BusinessError, flag: number) => {
  241. if (err) {
  242. console.error(`Updated failed, code is ${err.code},message is ${err.message}`);
  243. return;
  244. }
  245. if (flag != 0) {
  246. success?.()
  247. }
  248. })
  249. }
  250. }
  251. /**
  252. * 根据id删除数据
  253. * @param tableName
  254. * @param queryParam
  255. * @param success
  256. */
  257. static deleteItemByIdSync<T>(table: new () => T, id: number) {
  258. let predicates = new relationalStore.RdbPredicates(table.name);
  259. predicates = predicates.equalTo("id", id)
  260. if (RelationalStoreUtils.cloudLoadStore !== undefined) {
  261. const flag = (RelationalStoreUtils.cloudLoadStore as relationalStore.RdbStore).deleteSync(predicates)
  262. if (flag != 0) {
  263. return true
  264. }
  265. }
  266. return false
  267. }
  268. }