DataBaseUtil.ets 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. // DataBaseUtil - 数据库工具类
  2. import { relationalStore } from '@kit.ArkData';
  3. import { common } from '@kit.AbilityKit';
  4. import Logger from './Logger';
  5. const TAG = 'heanup DataBaseUtil';
  6. export class DataBaseUtil {
  7. private static instance: DataBaseUtil;
  8. private rdbStore: relationalStore.RdbStore | null = null;
  9. private context: common.Context | undefined;
  10. public static getInstance(): DataBaseUtil {
  11. if (!DataBaseUtil.instance) {
  12. DataBaseUtil.instance = new DataBaseUtil();
  13. }
  14. return DataBaseUtil.instance;
  15. }
  16. public setContext(context: common.Context): void {
  17. this.context = context;
  18. }
  19. public async getDB(): Promise<relationalStore.RdbStore> {
  20. if (this.rdbStore) {
  21. return this.rdbStore;
  22. }
  23. if (!this.context) {
  24. const err = new Error('Context未设置,请先调用setContext');
  25. Logger.error(TAG, err.message);
  26. throw err;
  27. }
  28. const config: relationalStore.StoreConfig = {
  29. name: 'mediaDB.db',
  30. securityLevel: relationalStore.SecurityLevel.S1
  31. };
  32. try {
  33. this.rdbStore = await relationalStore.getRdbStore(this.context, config);
  34. Logger.info(TAG, '数据库初始化成功');
  35. return this.rdbStore;
  36. } catch (err) {
  37. const error = err as Error;
  38. Logger.error(TAG, `数据库初始化失败: ${error.message}`);
  39. throw error;
  40. }
  41. }
  42. // 执行SQL语句
  43. public async executeSql(sql: string): Promise<void> {
  44. try {
  45. const db = await this.getDB();
  46. await db.executeSql(sql);
  47. Logger.info(TAG, `执行SQL成功: ${sql.substring(0, 50)}...`);
  48. } catch (err) {
  49. const error = err as Error;
  50. Logger.error(TAG, `执行SQL失败: ${error.message}`);
  51. throw error;
  52. }
  53. }
  54. // 插入数据
  55. public async insert(tableName: string, values: relationalStore.ValuesBucket): Promise<number> {
  56. try {
  57. const db = await this.getDB();
  58. const rowId = await db.insert(tableName, values);
  59. Logger.info(TAG, `插入数据成功,行ID: ${rowId}`);
  60. return rowId;
  61. } catch (err) {
  62. const error = err as Error;
  63. Logger.error(TAG, `插入数据失败: ${error.message}`);
  64. throw error;
  65. }
  66. }
  67. // 更新数据
  68. public async update(tableName: string, values: relationalStore.ValuesBucket, predicates: relationalStore.RdbPredicates): Promise<number> {
  69. try {
  70. const db = await this.getDB();
  71. const rows = await db.update(values, predicates);
  72. Logger.info(TAG, `更新数据成功,影响行数: ${rows}`);
  73. return rows;
  74. } catch (err) {
  75. const error = err as Error;
  76. Logger.error(TAG, `更新数据失败: ${error.message}`);
  77. throw error;
  78. }
  79. }
  80. // 删除数据
  81. public async delete(predicates: relationalStore.RdbPredicates): Promise<number> {
  82. try {
  83. const db = await this.getDB();
  84. const rows = await db.delete(predicates);
  85. Logger.info(TAG, `删除数据成功,影响行数: ${rows}`);
  86. return rows;
  87. } catch (err) {
  88. const error = err as Error;
  89. Logger.error(TAG, `删除数据失败: ${error.message}`);
  90. throw error;
  91. }
  92. }
  93. // 查询数据
  94. public async query(predicates: relationalStore.RdbPredicates, columns?: Array<string>): Promise<relationalStore.ResultSet> {
  95. try {
  96. const db = await this.getDB();
  97. const resultSet = await db.query(predicates, columns);
  98. return resultSet;
  99. } catch (err) {
  100. const error = err as Error;
  101. Logger.error(TAG, `查询数据失败: ${error.message}`);
  102. throw error;
  103. }
  104. }
  105. // 查询数据(简化版,用于RemoteDriveManager)
  106. public async queryData(tableName: string, columns: Array<string>, predicates?: relationalStore.RdbPredicates): Promise<relationalStore.ResultSet> {
  107. try {
  108. const db = await this.getDB();
  109. if (predicates) {
  110. return await db.query(predicates, columns);
  111. } else {
  112. const pred = new relationalStore.RdbPredicates(tableName);
  113. return await db.query(pred, columns);
  114. }
  115. } catch (err) {
  116. const error = err as Error;
  117. Logger.error(TAG, `查询数据失败: ${error.message}`);
  118. throw error;
  119. }
  120. }
  121. // 插入数据(简化版,用于RemoteDriveManager)
  122. public async insertData(tableName: string, values: relationalStore.ValuesBucket): Promise<number> {
  123. return await this.insert(tableName, values);
  124. }
  125. // 更新数据(简化版,用于RemoteDriveManager)
  126. public async updateData(tableName: string, values: relationalStore.ValuesBucket, predicates: relationalStore.RdbPredicates): Promise<number> {
  127. return await this.update(tableName, values, predicates);
  128. }
  129. // 删除数据(简化版,用于RemoteDriveManager)
  130. public async deleteData(predicates: relationalStore.RdbPredicates): Promise<number> {
  131. return await this.delete(predicates);
  132. }
  133. // 查询其他设备的表(简化版占位)
  134. public async queryTableFromOtherDevice(tableName: string): Promise<relationalStore.ResultSet | null> {
  135. Logger.info(TAG, `查询其他设备表: ${tableName}`);
  136. // TODO: 实现跨设备查询逻辑
  137. return null;
  138. }
  139. // 关闭数据库
  140. public async closeDB(): Promise<void> {
  141. if (this.rdbStore) {
  142. try {
  143. await relationalStore.deleteRdbStore(this.context!, 'mediaDB.db');
  144. this.rdbStore = null;
  145. Logger.info(TAG, '数据库关闭成功');
  146. } catch (error) {
  147. Logger.error(TAG, `数据库关闭失败: ${error}`);
  148. }
  149. }
  150. }
  151. }