有没有HarmonyOS鸿蒙Next工程师大佬路过,新手遇到了一个问题,各种方法都没办法解决,怎么办

有没有HarmonyOS鸿蒙Next工程师大佬路过,新手遇到了一个问题,各种方法都没办法解决,怎么办

import relationalStore from '@ohos.data.relationalStore'
import common from '@ohos.app.ability.common';
import Logger from "../utils/Logger"
import { ColumnInfo } from '../pages/viewmodel/ColumnInfo';

const DB_FILENAME: string = 'BaiZhanKeep.db'

class DBUtil {
  rdbStore: relationalStore.RdbStore | null = null;

  // 初始化数据库
  initDB(context: common.UIAbilityContext): Promise<void> {
    let config: relationalStore.StoreConfig = {
      name: DB_FILENAME,
      securityLevel: relationalStore.SecurityLevel.S1
    }
    return new Promise<void>((resolve, reject) => {
      relationalStore.getRdbStore(context, config)
        .then(rdbStore => {
          this.rdbStore = rdbStore
          Logger.debug('rdbStore 初始化完成')
          resolve()
        })
        .catch((reason: Error) => {
          Logger.debug('rdbStore 初始化异常', JSON.stringify(reason))
          reject(reason)
        })
    })
  }

  // 增加表
  createTable(createSQL: string): Promise<void> {
    return new Promise<void>((resolve, reject) => {
      if (!this.rdbStore) {
        reject(new Error('RdbStore 未初始化'))
        return
      }
      this.rdbStore.executeSql(createSQL)
        .then(() => {
          Logger.debug('成功创建列表', createSQL)
          resolve()
        })
        .catch((err: Error) => {
          Logger.error('创建失败,' + err.message, JSON.stringify(err))
          reject(err)
        })
    })
  }

  // 插入数据
  insert(tableName: string, obj: any, columns: ColumnInfo[]): Promise<number> {
    return new Promise<number>((resolve, reject) => {
      if (!this.rdbStore) {
        reject(new Error('RdbStore 未初始化'))
        return
      }
      // 构建新增数据
      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)
        }
      })
    })
  }

  // 删除数据
  delete(predicates: relationalStore.RdbPredicates): Promise<number> {
    return new Promise<number>((resolve, reject) => {
      if (!this.rdbStore) {
        reject(new Error('RdbStore 未初始化'))
        return
      }
      this.rdbStore.delete(predicates, (err, rows) => {
        if (err) {
          Logger.error('删除失败', JSON.stringify(err))
          reject(err)
        } else {
          Logger.debug('删除成功,删除第' + rows.toString() + '行数据')
          resolve(rows)
        }
      })
    })
  }

  // 转换表中列的数据
  buildValueBucket(obj: any, columns: ColumnInfo[]): relationalStore.ValuesBucket {
    let value: relationalStore.ValuesBucket = {}
    columns.forEach(info => {
      let val = obj[info.name]
      if (typeof val !== 'undefined') {
        value[info.columnName] = val
      }
    })
    return value
  }
}

let dbUtil: DBUtil = new DBUtil()
export default dbUtil as DBUtil

更多关于有没有HarmonyOS鸿蒙Next工程师大佬路过,新手遇到了一个问题,各种方法都没办法解决,怎么办的实战教程也可以访问 https://www.itying.com/category-93-b0.html

11 回复

小伙伴你好大概是这样

如何使用:https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs/faqs-arkts-98

@State obj: Record<string, string> = {}
  aboutToAppear(): void {
    this.obj['a']
  }

更多关于有没有HarmonyOS鸿蒙Next工程师大佬路过,新手遇到了一个问题,各种方法都没办法解决,怎么办的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


感谢老哥

共同进步,

应该是可以定义成 map record?键值对那种,具体我忘了…已经躺床上了,

好的哥,我明天试试我也躺床上休息了ദ്ദി˶•̀֊•́)✧

啥问题?不让使用any?语法就是不让使用any格式,必须明确定义类型,

HarmonyOS的社区里有很多技术大牛分享经验,学到了很多有用的知识。

知道any不能用,但是不知道怎么替换掉代码中的any,自己试了一下都成不了 ⦁֊⦁꧞

鸿蒙Next开发问题可参考官方文档与社区资源。建议查阅HarmonyOS开发者官网的技术文档、示例代码及常见问题解答。可在华为开发者论坛或开源社区如Gitee的HarmonyOS专区搜索类似问题。若涉及具体代码错误,请提供详细日志或错误信息以便进一步分析。

从代码和截图来看,你遇到的问题是在调用 relationalStore.getRdbStore 时,context 参数传递不正确,导致数据库初始化失败。

问题核心:initDB 方法中,你期望传入一个 UIAbilityContext,但在实际调用时(很可能是在一个 UI 组件,例如 EntryComponent 中),直接传递了组件的 this.context。在 HarmonyOS Next 的 Stage 模型中,UI 组件的 contextContext 类型或其子类(如 AbilityContext),而非 UIAbilityContext

解决方案:

你需要获取到正确的 UIAbilityContext。在 UI 组件中,标准获取方式如下:

import common from '@ohos.app.ability.common';
import relationalStore from '@ohos.data.relationalStore';

// 在你的UI组件(例如EntryComponent)中
let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;

// 然后使用这个context初始化数据库
dbUtil.initDB(context).then(() => {
  // 初始化成功
}).catch((err) => {
  // 处理错误
});

关键点:

  1. 导入 getContext:确保从 @ohos.arkui.UIContext 导入 getContext 方法。
  2. 类型转换getContext(this) 返回的是 Context 类型,需要将其断言 (as) 为 UIAbilityContext,因为 getRdbStore 方法需要的是 UIAbilityContext
  3. 调用时机:确保在 UI 组件已经挂载(例如 aboutToAppear 生命周期中)后再调用 getContext

修改后,initDB 方法应该能接收到正确的上下文,从而成功初始化 RdbStore。如果问题依旧,请检查 Logger.debug 输出的具体错误信息,这有助于进一步定位。

回到顶部