HarmonyOS 鸿蒙Next 为啥数据库初始化很慢,每次加载进去都是没数据

发布于 1周前 作者 h691938207 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 为啥数据库初始化很慢,每次加载进去都是没数据

01-01 15:21:05.910   9512-9512     A00000/testTag                  pid-9512              I     Ability onWindowStageCreate

01-01 15:21:05.910   9512-9512     A03d00/JSAPP                    pid-9512              I     onWindowStageCreate开始加载数据库。。。。。。

01-01 15:21:05.910   9512-9512     A03d00/JSAPP                    pid-9512              I     initRdbStore begin

01-01 15:21:05.913   9512-9512     A03d00/JSAPP                    pid-9512              I     onWindowStageCreate 查询数据长度。。。。。。0

01-01 15:21:05.914   9512-9512     A03d00/JSAPP                    pid-9512              I     onWindowStageCreate loginModels。没数据。。。。。

01-01 15:21:05.938   9512-9512     A00000/testTag                  pid-9512              I     Ability onForeground

01-01 15:21:06.020   9512-9512     A00000/testTag                  pid-9512              I     Succeeded in loading the content.

01-01 15:21:06.123   9512-9512     A03d00/JSAPP                    pid-9512              I     initRdbStore succeed

01-01 15:21:06.123   9512-9512     A03d00/JSAPP                    pid-9512              I     createLoginTable begin

01-01 15:21:06.135   9512-9512     A03d00/JSAPP                    pid-9512              I     createLoginTable succeed

01-01 15:21:06.919   9512-9512     A03d00/JSAPP                    com.example.pb        I     onWindowStageCreate 查询数据–…:[{“id":1,“password”:“123456”,“mail”:"qwer@qq.com”,“date”:“2025年01月01日 15:01:58”}]

onWindowStageCreate(windowStage: window.WindowStage): void {
// Main window is created, set main page for this ability
hilog.info(0x0000, ‘testTag’, ‘%{public}s’, ‘Ability onWindowStageCreate’);
//加载数据库
console.log(‘onWindowStageCreate开始加载数据库。。。。。。’)
this.initDatabase(this.context)
console.log(‘onWindowStageCreate 查询数据长度。。。。。。’+this.loginModels.length)
if (this.loginModels.length !== 0){
console.log(‘onWindowStageCreate loginModels。有数据。。。。。’+this.loginModels.length)
windowStage.loadContent(‘pages/LoginPage’, (err) => {
if (err.code) {
hilog.error(0x0000, ‘testTag’, ‘Failed to load the content. Cause: %{public}s’, JSON.stringify(err) ?? ‘’);
return;
}
hilog.info(0x0000, ‘testTag’, ‘Succeeded in loading the content.’);
});
}else{
console.log(‘onWindowStageCreate loginModels。没数据。。。。。’)
windowStage.loadContent(‘pages/RegisterPage’, (err) => {
if (err.code) {
hilog.error(0x0000, ‘testTag’, ‘Failed to load the content. Cause: %{public}s’, JSON.stringify(err) ?? ‘’);
return;
}
hilog.info(0x0000, ‘testTag’, ‘Succeeded in loading the content.’);
});
}

}


更多关于HarmonyOS 鸿蒙Next 为啥数据库初始化很慢,每次加载进去都是没数据的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

您好!

请您提供下

1、使用SDK版本及IDE版本信息;

SDK版本可以再IDE的File->Settings->OpenHarmony SDK中查看到,例如:5.0.0.71

IDE版本可以在Help->About DevEco Studio中查看到,例如:Build Version: 5.0.5.306

2、请您复现该问题后,打包日志;

例如,在DevEco软件右下角Device File Browser:data/log下导出整个hilog文件夹;

我们来具体分析下!谢谢

更多关于HarmonyOS 鸿蒙Next 为啥数据库初始化很慢,每次加载进去都是没数据的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


this.initDatabase(this.context)方法定义呢?

public async initRdbStore(context: Context){ console.info(‘initRdbStore begin’); if(!context){ console.error(‘initRdbStore context is invalid’) return } if(this.rdbStore){ console.error(‘rdbStore is exist’) return }

const STORE_CONFIG: relationalStore.StoreConfig = {
  name: LoginDBUtils.DB_NAME, // 数据库文件名
  securityLevel: relationalStore.SecurityLevel.S1, // 数据库安全级别
  encrypt: false, // 可选参数,指定数据库是否加密,默认不加密
  isReadOnly: false // 可选参数,指定数据库是否以只读方式打开。该参数默认为false,表示数据库可读可写。该参数为true时,只允许从数据库读取数据,不允许对数据库进行写操作,否则会返回错误码801。
}
try{
  this.rdbStore = await relationalStore.getRdbStore(context,STORE_CONFIG)
  console.info('initRdbStore succeed')
  await this.createLoginTable()
}catch (err){
  console.info('initRdbStore failed'+err)
}

}

private async createLoginTable(){ const sql = CREATE TABLE IF NOT EXISTS ${LoginDBUtils.Login_NAME} ( ID INTEGER PRIMARY KEY AUTOINCREMENT, PASSWORD TEXT NOT NULL, MAIL TEXT NOT NULL, DATE TEXT NOT NULL ); console.info(‘createLoginTable begin’) try{ if(this.rdbStore != undefined){ await this.rdbStore.executeSql(sql) console.info(‘createLoginTable succeed’) } }catch (e){ console.error('createLoginTable failed : '+e) } }

你是不是忽略了这个initRdbStore是个异步执行的方法,this.initDatabase(this.context) console.log(‘onWindowStageCreate 查询数据长度。。。。。。’+this.loginModels.length) 当this.initDatabase(this.context)这一句调用之后没有等在那里,而是直接向下执行了。所以在执行后面的语句时Database并没有完成初始化,所以打印出【onWindowStageCreate 查询数据长度。。。。。。0】和【onWindowStageCreate loginModels。没数据。。。。。】你可以把initRdbStore改成同步执行方法。

同步试了下一样的。。。。

HarmonyOS 鸿蒙Next数据库初始化慢的原因可能涉及多个方面:

  1. 系统资源分配:在初始化过程中,系统需要为数据库分配必要的内存、存储等资源。如果系统资源紧张,如内存不足或存储I/O性能不佳,会导致初始化速度变慢。

  2. 数据库文件检查:为确保数据库文件的完整性和一致性,系统在初始化时会进行一系列的检查操作。这些检查操作,特别是针对大型数据库,可能会消耗较长时间。

  3. 索引重建:如果数据库在上次使用后进行了更新或修复,系统可能需要重建索引,以确保查询性能。索引重建是一个资源密集型任务,会影响初始化速度。

  4. 数据加载策略:鸿蒙Next的数据库可能采用了特定的数据加载策略,如延迟加载或按需加载。这些策略在初始化时可能不会立即加载所有数据,导致用户感知到“没数据”的现象。

  5. 版本更新:如果鸿蒙Next系统或数据库组件进行了版本更新,新版本的初始化流程可能引入了额外的步骤或优化,从而影响初始化速度。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部