HarmonyOS鸿蒙Next中初始化数据库连接实例后,当调用每个静态查询方法都会初始化数据库实例,但是页面就加载不了数据
HarmonyOS鸿蒙Next中初始化数据库连接实例后,当调用每个静态查询方法都会初始化数据库实例,但是页面就加载不了数据,是怎么回事?
数据库连接类的代码如下:
import { CourseCategory } from './CourseCategory';
import { Course } from './Course';
//entry/src/main/ets/services/CloudDBService.ts
//@ts-ignore
import * as schema from './app-schema.json';
import { AGConnectCloudDB, CloudDBZoneConfig, CloudDBZone, CloudDBZoneQuery } from '@hw-agconnect/database-ohos';
import { AGCRoutePolicy } from '@hw-agconnect/core-ohos';
import { getAGConnect } from './AgcConfig';
import { Teacher } from './Teacher';
import hilog from '@ohos.hilog'
export class CloudDBService {
private static readonly ZONE_NAME: string = "cloudDBZoneName1";
private static readonly ORDER_BY_NAME: string = "name"
private static readonly ORDER_BY_COURSENAME: string = "courseName"
private static readonly ORDER_BY_SUPERNAME: string = "superName"
private static init(context: any): Promise<CloudDBZone> {
hilog.error(1,'Init','Init Cloud DB Zone')
return new Promise((resolve, reject) => {
getAGConnect(context);
AGConnectCloudDB.initialize(context);
AGConnectCloudDB.getInstance({
context: context,
agcRoutePolicy: AGCRoutePolicy.CHINA,
objectTypeInfo: schema
}).then(ret => {
return resolve(ret.openCloudDBZone(this.ZONE_NAME));
}).catch(err => {
return reject(err);
console.error('init error: ' + JSON.stringify(err))
});
})
}
public static queryTeacher(context: any): Promise<Array<Teacher>> {
hilog.error(1,'query','query Teacher table')
return new Promise((resolve, reject) => {
const query = CloudDBZoneQuery.where(Teacher).orderByAsc(this.ORDER_BY_NAME);
this.init(context).then(ret => {
ret.executeQuery(query).then(ret => {
resolve(ret.getSnapshotObjects());
}).catch(err => {
reject(err);
console.error('query Teacher error: '+JSON.stringify(err))
});
});
})
}
public static queryCourse(context1: any): Promise<Array<Course>> {
hilog.error(1,'query','query Course table')
return new Promise((resolve, reject) => {
const query = CloudDBZoneQuery.where(Course).orderByAsc(this.ORDER_BY_COURSENAME);
this.init(context1).then(ret => {
ret.executeQuery(query).then(ret => {
resolve(ret.getSnapshotObjects());
}).catch(err => {
reject(err);
console.error('query Course error: '+JSON.stringify(err))
});
});
})
}
public static queryCourseCategory(context2: any): Promise<Array<CourseCategory>> {
hilog.error(1,'query','query CourseCategory table')
return new Promise((resolve, reject) => {
const query = CloudDBZoneQuery.where(CourseCategory).orderByAsc(this.ORDER_BY_SUPERNAME);
this.init(context2).then(ret => {
ret.executeQuery(query).then(ret => {
resolve(ret.getSnapshotObjects());
}).catch(err => {
reject(err);
console.error('query CourseCategory error: '+JSON.stringify(err))
});
});
})
}
}
导师页面代码如下:
import hilog from '@ohos.hilog';
import { Teacher } from '../services/Teacher';
import { CloudDBService } from '../services/CloudDBService';
import { TeacherEntity } from '../model/Model';
import { getTeacherArray } from '../model/Model';
@Entry
@Component
export struct TeacherPage {
@State message: string = 'Hello World'
@State teacherArray: Array<Teacher> = null
// 获取数据
getTeacher() {
// 调用云数据库
CloudDBService.queryTeacher(getContext(this)).then(res => {
console.error('xx cloud db result: ' + JSON.stringify(res));
hilog.error(1,'query','xx cloud db result: '+ JSON.stringify(res))
this.teacherArray = res
hilog.error(1,'query','Teacher table data'+ this.teacherArray)
}).catch(err => {
console.error('xx error: ', err && err.message);
});
}
aboutToAppear(){
this.getTeacher()
}
build() {
Column() {
Column() {
List() {
ForEach(this.teacherArray,
(item1: any) => {
ListItem() {
Row() {
Image($rawfile('teacher.JPG'))
.width("40%")
.height("100%")
Column() {
Row(){
Text(`${item1.name}`)
.width("65%")
.height("25%")
.textAlign(TextAlign.Start)
.fontSize("20fp")
.fontWeight(FontWeight.Bold)
Button('联系',{ type: ButtonType.Capsule, stateEffect: true })
.width("35%")
.height("25%")
.borderRadius(20)
.backgroundColor('#ff0b00')
}
.padding(5)
Text(`${item1.subject}`)
.width("100%")
.height("25%")
.offset({ x: "0px", y: "0px" })
.backgroundColor("#42a7f3")
.textAlign(TextAlign.Center)
.fontSize("20fp")
Text(`${item1.qualifications}`)
.width("100%")
.height("25%")
.offset({ x: "0px", y: "0px" })
.backgroundColor("#dff834")
.textAlign(TextAlign.Center)
.fontSize("20fp")
Text('教学经验: '+item1.experience+' 年')
.width("100%")
.height("25%")
.offset({ x: "0", y: "0px" })
.backgroundColor("#40dadb")
.fontColor("#fb0202")
.textAlign(TextAlign.Center)
.fontSize("20fp")
}
.width("60%")
.height("100%")
.alignItems(HorizontalAlign.End)
}
.width("100%")
.height("100%")
}
.width("100%")
.height("120vp")
.margin({ bottom: "10vp" })
})
}
.width("100%")
.height("100%")
}
.width("100%")
.height("100%")
.justifyContent(FlexAlign.Center)
}
.width("100%")
.height("100%")
}
}
最后我查看了log,只能查询了一张表CourseCategory的数据,无法查询到另外两张表Teacher和Course的数据,导致了页面显示空白。
你可以在init时,判断一下,如果为null才创建,或者把init初始放在entryAbility里的onCreate函数初始化,然后在保存到全局变量,在其它地方使用。
更多关于HarmonyOS鸿蒙Next中初始化数据库连接实例后,当调用每个静态查询方法都会初始化数据库实例,但是页面就加载不了数据的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
认真学习你的新知识
谢谢,互相学习新技术,加油。👍
您好,您的问题需要进一步分析,请您通过在线提单进一步解决:https://developer.huawei.com/consumer/cn/support/feedback/#/,感谢您的反馈和支持。
你好,还是会出现白屏的问题,已经提单D261285,但是暂时还没有很好的解决方法。
在HarmonyOS鸿蒙Next中,如果每次调用静态查询方法都重新初始化数据库实例,可能会导致性能问题,进而影响页面加载数据。建议在应用启动时初始化一次数据库连接实例,并在整个应用生命周期中复用该实例。可以通过单例模式或依赖注入来管理数据库连接,确保每次查询时使用的是同一个实例,从而避免重复初始化的开销,提升页面加载效率。