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的数据,导致了页面显示空白。

6 回复

你可以在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中,如果每次调用静态查询方法都重新初始化数据库实例,可能会导致性能问题,进而影响页面加载数据。建议在应用启动时初始化一次数据库连接实例,并在整个应用生命周期中复用该实例。可以通过单例模式或依赖注入来管理数据库连接,确保每次查询时使用的是同一个实例,从而避免重复初始化的开销,提升页面加载效率。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!