OpenHarmony开发者论坛

标题: 代码报错Property 'rdbStore' has no initializer and is not definitely assigned in the constructor. <ArkTSCheck> [打印本页]

作者: ershi    时间: 2024-10-10 15:37
标题: 代码报错Property 'rdbStore' has no initializer and is not definitely assigned in the constructor. <ArkTSCheck>
【求大佬解决】

```
class DBUtil{
  //使用变量来获取关系型数据库操作对象
  rdbStore: relationalStore.RdbStore
  
    //数据库初始化
  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[]) romise<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
```

在网上找的方法是在rdbStore: relationalStore.RdbStore下面创建一个构建函数,但是创建完let dbUtil: DBUtil = new DBUtil()这里需要传一个参数我不清楚要传什么参数,有没有大佬可以帮忙看看这个问题要怎么解决


使用的是api10
DevEvoStudio版本:5.0
SDK版本:

作者: hyacinth养花人    时间: 2024-10-11 09:19
标题: 代码报错Property 'rdbStore' has no initializer and is not definitely assigned in the constructor. <ArkTSCheck>
[md]成员变量rdbStore初始化一定要赋值,可以这么写:

rdbStore: relationalStore.RdbStore | undefined = undefined

下面使用到rdbStore的地方也需要判断值是否存在
[/md]




欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5