二十十十十十 2024-10-11 14:26 采纳率: 100%
浏览 59
已结题

【求解决】鸿蒙代码报错

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 的地方需要判断值是否存在,但是还是不清楚具体要怎么改,所以再次求助一下

  • 写回答

1条回答 默认 最新

  • 香格里辣 2024-10-11 23:56
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    从你提供的代码中看,问题出现在this.rdbStore上,报错提示为"Object is possibly 'undefined'"。这个错误的原因是你在调用this.rdbStore的方法时,编译器无法确定this.rdbStore是否已经被初始化(即是否可能为undefined)。你需要在使用this.rdbStore之前检查它是否已经存在。你可以通过添加一个条件判断来解决这个问题。

    对于你的代码,你可以在调用this.rdbStore的每个方法之前添加检查其是否存在的代码。例如:

    if (this.rdbStore) {
      // 现在可以安全地使用 this.rdbStore 调用方法
      this.rdbStore.insert(tableName, value, ...);
    } else {
      console.error('rdbStore is not initialized');
    }
    

    这样的检查可以确保只有当this.rdbStore已经初始化后才会调用其方法,从而避免运行时错误。同时,你也可以考虑在初始化数据库时确保rdbStore被正确初始化,例如在initDB方法中增加对rdbStore的初始化检查。

    另外,对于你的代码中大量使用到的Promise,你可以考虑使用async/await语法来简化你的代码,这样可以使你的代码更易读和维护。例如:

    async function createTable() {
      try {
        if (this.rdbStore) {
          await this.rdbStore.executeSql(createSQl);
          Logger.debug('成功创建表', createSQl);
        } else {
          console.error('rdbStore is not initialized');
        }
      } catch (err) {
        Logger.error('创建表失败', err);
        throw err;
      }
    }
    

    在这个例子中,如果this.rdbStore未初始化,函数会立即打印错误并退出。否则,它会尝试执行SQL命令并处理可能的错误。注意,使用async/await语法需要你的函数返回一个Promise或者在函数声明前添加async关键字。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月24日
  • 已采纳回答 11月16日
  • 创建了问题 10月11日