HarmonyOS鸿蒙Next中如何解决首选项数据持久化调用报错

HarmonyOS鸿蒙Next中如何解决首选项数据持久化调用报错

【问题现象】

首选项数据持久化调用getPreferencesSync报错,报错信息为:code:15500000 message:Inner error. Error code 15500000

问题代码如下:

import dataPreferences from '@ohos.data.preferences';

let preferences: dataPreferences.Preferences | null = null;
export default class EntryAbility extends UIAbility {
  onWindowStageCreate(windowStage: window.WindowStage) {
    try {
       let options: dataPreferences.Options = {
         name: 'myStore'
       };
       preferences = dataPreferences.getPreferencesSync(this.context, options);
     } catch (e) {
       Logger.info(e)
     }
  }
}

【定位思路】

错误码15500000,用户首选项内部发生错误,通常是getPreferences传入的context有问题。

  • 排查传入的context是否为undefined
  • 排查是否为Stage模型;
  • 排查this使用是否正确。

【解决方案】

如果是直接在调用首选项处调用getContext()获取context,建议修改成在entryability里获取全局的context,再在调用首选项处使用全局的context替代getContext()

示例代码如下:

// 全局 GlobalContext
import type common from '@ohos.app.ability.common';

 export class GlobalContext {
   private static context: common.UIAbilityContext;

   public static initContext(context: common.UIAbilityContext): void {
     GlobalContext.context = context;
   }

   public static getContext(): common.UIAbilityContext {
     return GlobalContext.context;
   }
 }

 // EntryAbility.ets
 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
    //初始化全局Context
    GlobalContext.initContext(this.context);
  }

 onWindowStageCreate(windowStage: window.WindowStage): void {
     hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

     let options: preferences.Options = {
       name: 'myStore'
     };
     //在调用preferences处使用获取的全局Context替代getContext()
     //let p = preferences.getPreferencesSync(getContext(), options);
     let p = preferences.getPreferencesSync(this.context, options);
     p.putSync("name", "txy");
     let a = p.getSync("name", "txy1")
     console.info("xxx" + a.toString())
     windowStage.loadContent('pages/Index', (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.');
     });
   }

参考Stage模型示例检查调用方法是否正确。

ArkUI语言特性要求ArkTS不支持在函数和类的静态方法中使用this,只能在类的实例方法中使用this函数内使用this参考相关文档。

示例代码如下:

class Test {
   value: string = ''
   constructor (value: string) {
     this.value = value
   }

   foo() {
     console.log(this.value);
   }
 }

 let obj: Test = new Test('abc');
 obj.foo();

【总结】

在使用首选项时需要注意方法调用时传入的context是否一致,建议获取一个全局的context,在调用方法时使用。在关系型数据库RdbStore也需要注意此问题。


更多关于HarmonyOS鸿蒙Next中如何解决首选项数据持久化调用报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中如何解决首选项数据持久化调用报错的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,首选项数据持久化调用报错可能由以下原因引起:

  1. 首选项未初始化:确保在使用首选项之前,已经通过Preferences.getPreferences(context)方法正确初始化。

  2. 键值对格式错误:检查存储的键值对是否符合首选项支持的格式,如Stringintboolean等。

  3. 权限问题:确保应用已获取必要的存储权限,如ohos.permission.WRITE_USER_STORAGEohos.permission.READ_USER_STORAGE

  4. 上下文错误:确保传递的context参数正确,通常为AbilityAbilitySlice的上下文。

  5. 存储空间不足:检查设备存储空间是否充足,存储空间不足可能导致数据持久化失败。

  6. 并发访问冲突:避免多个线程同时访问和修改首选项数据,使用同步机制确保线程安全。

  7. 首选项文件损坏:如果首选项文件损坏,可能导致读取或写入失败,尝试删除并重新创建首选项文件。

  8. API版本兼容性:确保使用的首选项API与当前鸿蒙系统版本兼容,避免使用已弃用或不支持的API。

  9. 日志分析:查看系统日志,定位具体错误信息,根据日志提示进行问题排查。

  10. 首选项数据量过大:避免存储过大的数据,首选项适用于小规模数据存储,大数据应考虑其他存储方案。

通过以上步骤,可以排查和解决HarmonyOS鸿蒙Next中首选项数据持久化调用报错的问题。

回到顶部