创建 DbUtil
类的一个实例在 initDB
方法中,设置数据库的配置,包括数据库文件名和安全等级,然后调用 relationalStore.getRdbStore
方法获取数据库存储实例。使用 initDB
方法初始化数据库。这个方法接收一个 UIAbilityContext
类型的参数,用于获取应用的上下文信息。使用 createTable
方法执行 SQL 语句来创建表。接收一个 SQL 字符串参数,该字符串包含创建表的 SQL 语句。使用 insert
方法向数据库表中插入数据。接收表名、要插入的数据对象以及列信息数组作为参数。使用 delete
方法根据给定的条件删除数据。这个方法接收一个 RdbPredicates
对象,该对象包含删除条件。使用 queryForList
方法查询数据库表中的数据。这个方法接收查询条件和列信息数组作为参数,并返回一个泛型列表。parseResultSet
方法用于将查询结果集解析为 JavaScript 对象数组。这个方法遍历结果集的每一行,并根据列信息将数据转换为对象。buildValueBucket
方法用于构建用于插入或更新操作的数据对象。它根据给定的数据对象和列信息数组创建一个键值对集合。在执行数据库操作的过程中,使用 Logger
记录关键的日志信息,以便于调试和追踪程序的运行状态。在执行数据库操作时,处理出现的错误,如 SQL 语法错误、违反数据约束、数据库连接问题等。在不再需要数据库操作时,释放相关资源,关闭数据库连接。
import common from '@ohos.app.ability.common';
import relationalStore from '@ohos.data.relationalStore';
import { ColumnInfo, ColumnType } from '../bean/ColumnInfo';
import Logger from './Logger';
const DB_FILENAME: string = 'HeiMaHealthy.db';
class DbUtil {
// 类成员变量 rdbStore,用于存储关系型数据库存储实例。
rdbStore: relationalStore.RdbStore;
// initDB 方法用于初始化数据库,接收一个 UIAbilityContext 类型的参数 context。
initDB(context: common.UIAbilityContext): Promise<void> {
// 定义数据库配置对象 config。
let config: relationalStore.StoreConfig = {
name: DB_FILENAME, // 设置数据库文件名。
securityLevel: relationalStore.SecurityLevel.S1 // 设置数据库的安全等级。
};
// 返回一个 Promise 对象,用于异步处理数据库初始化。
return new Promise<void>((resolve, reject) => {
// 调用 getRdbStore 方法获取关系型数据库存储实例。
relationalStore.getRdbStore(context, config)
.then(rdbStore => {
// 初始化成功,将实例赋值给类成员变量 rdbStore 并记录日志。
this.rdbStore = rdbStore;
Logger.debug('rdbStore 初始化完成!');
resolve(); // 解决 Promise。
})
.catch(reason => {
// 初始化失败,记录日志并拒绝 Promise。
Logger.debug('rdbStore 初始化异常', JSON.stringify(reason));
reject(reason);
});
});
}
// createTable 方法用于执行创建表的 SQL 语句。
createTable(createSQL: string): Promise<void> {
return new Promise((resolve, reject) => {
// 使用 rdbStore 的 executeSql 方法执行传入的创建表 SQL 语句。
this.rdbStore.executeSql(createSQL)
.then(() => {
// 创建表成功,记录日志并解决 Promise。
Logger.debug('创建表成功', createSQL);
resolve();
})
.catch(err => {
// 创建表失败,记录错误日志并拒绝 Promise。
Logger.error('创建表失败,' + err.message, JSON.stringify(err));
reject(err);
});
});
}
// insert 方法用于向指定表中插入数据。
insert(tableName: string, obj: any, columns: ColumnInfo[]): Promise<number> {
return new Promise((resolve, reject) => {
// 构建用于插入的数据对象。
let value = this.buildValueBucket(obj, columns);
// 调用 rdbStore 的 insert 方法将数据插入到指定表中。
this.rdbStore.insert(tableName, value, (err, id) => {
if (err) {
// 插入失败,记录错误日志并拒绝 Promise。
Logger.error('新增失败!', JSON.stringify(err));
reject(err);
} else {
// 插入成功,记录日志并解决 Promise,返回新插入数据的 ID。
Logger.debug('新增成功!新增id:', id.toString());
resolve(id);
}
});
});
}
// delete 方法用于根据条件删除数据。
delete(predicates: relationalStore.RdbPredicates): Promise<number> {
return new Promise((resolve, reject) => {
// 调用 rdbStore 的 delete 方法根据 predicates 条件删除数据。
this.rdbStore.delete(predicates, (err, rows) => {
if (err) {
// 删除失败,记录错误日志并拒绝 Promise。
Logger.error('删除失败!', JSON.stringify(err));
reject(err);
} else {
// 删除成功,记录日志并解决 Promise,返回被删除的行数。
Logger.debug('删除成功!删除行数:', rows.toString());
resolve(rows);
}
});
});
}
// queryForList 方法用于查询数据并返回一个泛型列表。
queryForList<T>(predicates: relationalStore.RdbPredicates, columns: ColumnInfo[]): Promise<T[]> {
return new Promise((resolve, reject) => {
// 调用 rdbStore 的 query 方法执行查询操作。
this.rdbStore.query(predicates, columns.map(info => info.columnName), (err, result) => {
if (err) {
// 查询失败,记录错误日志并拒绝 Promise。
Logger.error('查询失败!', JSON.stringify(err));
reject(err);
} else {
// 查询成功,记录日志并解析结果集。
Logger.debug('查询成功!查询行数:', result.rowCount.toString());
resolve(this.parseResultSet(result, columns));
}
});
});
}
// parseResultSet 方法用于解析查询结果集,将其转换为对象数组。
parseResultSet<T> (result: relationalStore.ResultSet, columns: ColumnInfo[]): T[] {
// 声明最终返回的结果数组。
let arr = [];
// 判断是否有结果。
if (result.rowCount <= 0) {
return arr;
}
// 处理结果集中的每一行。
while (!result.isAtLastRow) {
// 移动到结果集的下一行。
result.goToNextRow();
// 初始化一个对象用于存储当前行的数据。
let obj = {};
columns.forEach(info => {
let val = null;
// 根据列的数据类型获取对应数据。
switch (info.type) {
case ColumnType.LONG:
val = result.getLong(result.getColumnIndex(info.columnName));
break;
case ColumnType.DOUBLE:
val = result.getDouble(result.getColumnIndex(info.columnName));
break;
case ColumnType.STRING:
val = result.getString(result.getColumnIndex(info.columnName));
break;
case ColumnType.BLOB:
val = result.getBlob(result.getColumnIndex(info.columnName));
break;
}
obj[info.name] = val;
});
// 将对象添加到结果数组。
arr.push(obj);
// 记录当前查询到的数据。
Logger.debug('查询到数据:', JSON.stringify(obj));
}
return arr;
}
// buildValueBucket 方法用于根据给定的对象和列信息数组构建一个键值对的集合。
buildValueBucket(obj: any, columns: ColumnInfo[]): relationalStore.ValuesBucket {
let value = {};
columns.forEach(info => {
let val = obj[info.name];
// 如果值存在且不是 undefined,则将其添加到 value 对象中。
if (typeof val !== 'undefined') {
value[info.columnName] = val;
}
});
return value;
}
}
// 创建 DbUtil 类的实例。
let dbUtil: DbUtil = new DbUtil();
// 将 dbUtil 实例作为默认导出,使用类型断言确保其类型为 DbUtil。
export default dbUtil as DbUtil;