class DBUtil{
//使用变量来获取关系型数据库操作对象
rdbStore: relationalStore.RdbStore | undefined = undefined
//数据库初始化
initDB(context: common.UIAbilityContext): Promise<void> {
let config: relationalStore.StoreConfig = {
//名称
name: DB_FILENAME,
//安全等级
securityLevel: relationalStore.SecurityLevel.S1
}
return new Promise<void>((resolve, reject) => { //resolve初始化完成返回,reject初始化失败返回
relationalStore.getRdbStore(context, config)//传入日志
.then(rdbStore => {
this.rdbStore = rdbStore
Logger.debug('rdbStore', 'rdbStore初始化完成')
resolve()
})
.catch((Reason: string) => {
Logger.debug('rdbStore', 'rdbStore初始化异常', JSON.stringify(Reason))
reject(Reason)
})
})
}
//创建数据库表
createTable(createSQl: string): Promise<void> {
return new Promise((resolve, reject) => {
this.rdbStore.executeSql(createSQl)
.then(() => {
Logger.debug('成功创建表', createSQl)
resolve()
})
.catch((err: Error) => {
Logger.error('创建表失败,' + err.message, JSON.stringify(err))
reject(err)
})
})
}
//方法1:增加数据
insert(tableName: string, obj: RecordPO, columns: ColumnInfo[]) { //表名,对象,列
return new Promise<string>((resolve, reject) => {
//构建新增数据
let value = this.buildValueBucket(obj,columns)
//实现新增
this.rdbStore.insert(tableName, value, (err, id) => {
if (err) {
Logger.error('新增失败', JSON.stringify(err))
reject(err)
} else {
Logger.debug('新增成功,新增数据ID:' + id.toString())
resolve(id.toString())
}
})
})
}
//方法2:删减数据
delete(predicates: relationalStore.RdbPredicates) {
return new Promise<string | number>((resolve, reject) => {
this.rdbStore.delete(predicates, (err, rows) => {
if (err) {
Logger.error('删除失败', JSON.stringify(err))
reject(err)
} else {
Logger.debug('删除成功,删除第' + rows.toString() + '行数据')
resolve(rows)
}
})
})
}
//方法3:查找数据
queryForList<T> (predicates: relationalStore.RdbPredicates, columns: ColumnInfo[]) :Promise<T[]> { //查询条件,查询列信息
return new Promise((resolve,reject) => {
this.rdbStore.query(predicates,columns.map(info => info.columName), (err, result) => {
if (err) {
Logger.error('查询失败', JSON.stringify(err))
reject(err)
} else {
Logger.debug('查询成功,查询到 ' + result.rowCount.toString() + '行')
resolve(this.parseResulSet(result, columns))
}
})
})
}
//更改数据
update(obj:RecordPO, columns: ColumnInfo[], predicates: relationalStore.RdbPredicates) {
return new Promise<number>((resolve, reject) => {
let value = this.buildValueBucket(obj, columns)
this.rdbStore.update(value, predicates,(err, id) => {
if (err) {
Logger.error('修改失败', JSON.stringify(err))
reject(err)
} else {
Logger.debug('修改成功,修改数据ID为: ' + id)
resolve(id)
}
})
})
}
//处理查询方法返回的Promise类型数据
parseResulSet<T> (result: relationalStore.ResultSet, columns: ColumnInfo[]): T[] {
let arr = []
if(result.rowCount <= 0) { //如果行数<=0表示没查询到
return arr //直接返回空数组
}
//循环处理结果,循环条件:当所在行不是最后一行
while (!result.isAtFirstRow) {
//如果不是最后一行,去往下一行
result.goToLastRow()
//解析数据,转换对象
let obj:GeneratedObjectLiteralInterface_2= {}
columns.forEach(info => {
let val: number | string | Uint8Array | null
switch (info.type) {
case ColumnType.LONG:
val = result.getLong(result.getColumnIndex(info.columName))
break;
case ColumnType.DOUBLE:
val = result.getDouble(result.getColumnIndex(info.columName))
break;
case ColumnType.STRING:
val = result.getString(result.getColumnIndex(info.columName))
break;
case ColumnType.BLOB:
val = result.getBlob(result.getColumnIndex(info.columName))
break;
}
Object(obj)[info.name] = val
})
//复制完成将对象填入结果数组
arr.push() //arr.push(obj)
Logger.debug('查询到的数据:' + JSON.stringify(obj))
}
return arr
}
//转换表中列的数据类型
buildValueBucket(obj: RecordPO, columns: ColumnInfo[]): relationalStore.ValuesBucket {
let value:ValuesBucket = {}
columns.forEach(info => {
let val: ValuesBucket = Object(obj)[info.name] //获取列名
if (typeof val !== 'undefined') { //判断val不是没找到
Object (value)[info.columName] = val //如果名字不是undefined将名字复制给value
}
})
return value
}
}
let dbUtil: DBUtil = new DBUtil()
export default dbUtil as DBUtil
在创建数据库表和增删改查下面的this.rdbStore位置报错Object is possibly 'undefined'. 有大佬告诉我:下面使用到 rdbStore 的地方需要判断值是否存在,但是还是不清楚具体要怎么改,所以再次求助一下