有没有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
小伙伴你好大概是这样
如何使用: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 组件的 context 是 Context 类型或其子类(如 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) => {
// 处理错误
});
关键点:
- 导入
getContext:确保从@ohos.arkui.UIContext导入getContext方法。 - 类型转换:
getContext(this)返回的是Context类型,需要将其断言 (as) 为UIAbilityContext,因为getRdbStore方法需要的是UIAbilityContext。 - 调用时机:确保在 UI 组件已经挂载(例如
aboutToAppear生命周期中)后再调用getContext。
修改后,initDB 方法应该能接收到正确的上下文,从而成功初始化 RdbStore。如果问题依旧,请检查 Logger.debug 输出的具体错误信息,这有助于进一步定位。

