HarmonyOS 鸿蒙Next worker操作数据库问题
HarmonyOS 鸿蒙Next worker操作数据库问题
有一个DataBaseManager的class,在里面我声明了store数据库对象并初始化赋值,代码如下
export class DataBaseManager {
private static readonly baseDbName:string = “hm_v_book.db”;
private static store: relationalStore.RdbStore | undefined = undefined;
static initDataBase(param: InitSqlParam) {
const storeConfig: relationalStore.StoreConfig = {
name:
securityLevel: relationalStore.SecurityLevel.S4,
encrypt: true
};
relationalStore.getRdbStore(param.context, storeConfig, (err: BusinessError, rdbStore: relationalStore.RdbStore) => {
if (err) {
LogUtil.error(
return;
}
DataBaseManager.store = rdbStore;
DataBaseManager.store.executeSql(DataBaseSQL.createAddressBookTableSQL);
DataBaseManager.store.executeSql(DataBaseSQL.createUnitTableSQL);
LogUtil.error(‘Get RdbStore successfully.’);
if (param.onSuccess !== undefined) {
param.onSuccess();
}
})
}
然后我在页面中直接使用store的查询方法去查询数据库,并添加了一个loading的LoadingProgress组件,查询时会导致LoadingProgress卡顿无法正常动画,
这时我想将数据库的查询操作放到worker中去执行,但是在worker中得到的store对象是undefined,
结合上诉2种原因,我在查询数据库的时候该怎么操作才能让loading动画正常执行?
export class DataBaseManager {
private static readonly baseDbName:string = “hm_v_book.db”;
private static store: relationalStore.RdbStore | undefined = undefined;
static initDataBase(param: InitSqlParam) {
const storeConfig: relationalStore.StoreConfig = {
name:
${param.dbName}_${DataBaseManager.baseDbName}
,securityLevel: relationalStore.SecurityLevel.S4,
encrypt: true
};
relationalStore.getRdbStore(param.context, storeConfig, (err: BusinessError, rdbStore: relationalStore.RdbStore) => {
if (err) {
LogUtil.error(
Get RdbStore failed, code is ${err.code},message is ${err.message}
);return;
}
DataBaseManager.store = rdbStore;
DataBaseManager.store.executeSql(DataBaseSQL.createAddressBookTableSQL);
DataBaseManager.store.executeSql(DataBaseSQL.createUnitTableSQL);
LogUtil.error(‘Get RdbStore successfully.’);
if (param.onSuccess !== undefined) {
param.onSuccess();
}
})
}
然后我在页面中直接使用store的查询方法去查询数据库,并添加了一个loading的LoadingProgress组件,查询时会导致LoadingProgress卡顿无法正常动画,
这时我想将数据库的查询操作放到worker中去执行,但是在worker中得到的store对象是undefined,
结合上诉2种原因,我在查询数据库的时候该怎么操作才能让loading动画正常执行?
2 回复
分析发现store是采用静态方法初始化的,但是在序列化的过程中对象的方法是不支持传递的,因此需要在worker执行的方法中手动初始化store
针对HarmonyOS 鸿蒙Next worker操作数据库问题,以下是一些专业解答:
首先,HarmonyOS支持键值型数据库和关系型数据库,两者都具备备份与恢复功能。对于键值型数据库,可通过backup接口备份,restore接口恢复,deletebackup接口删除备份。关系型数据库则通过StoreConfig管理配置,如加密属性等。
其次,操作数据库时需注意并发写操作限制。HarmonyOS数据库中通常有4个读连接和1个写连接,同一时间仅支持一个写操作。因此,进行多条数据更新时,需控制好次序,避免并发写操作引发报错。
再者,数据库存储的数据量也有限制。建议单条数据不要超过2M,否则可能导致插入成功但读取失败的情况。
最后,确保正确打开数据库,不同context创建的数据库不是同一个。在多个Ability中访问同一个数据库时,需确保它们使用的是相同的context。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。