harmonyOS Next Api9之后用户首选项功能封装

152 阅读3分钟
使用前提,你得是基本熟悉harmonyOS next Stroge 开发
为啥要写这个封装?

作为一个前端开发,用户首选项功能等同于前端LocalStorage功能,如果按他们文档来,使用起来实在绕口(手),故将这个方法封装一下,以达到类似前端使用local storage功能,当然,你也可以把它当做store使用哈哈哈

接下来,show you the code...

先要在entryability/EntryAbility.ets中声明,这步根据教学视频好像是必要的,至于为啥,那就不清楚了哈哈哈

onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
  hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');

  //使用用户首选项第一步,先创建用户首选项
  let options:preferences.Options={name:'myStore'}//这里命名可以自己定义,当然你可以通过Resource或命名文件来统一管理,我这里就简化了,直接写死,不影响使用
  preferences.getPreferences(this.context,options)
  }
创建一个文件,例如GlobalContext.ets,在里面写封装方法,因为用户首选项的异步特性,所有方法都是异步执行的,使用的时候会详细说明

class LocalStorage {
  public getKvStore(): Promise<distributedKVStore.SingleKVStore> {
    let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION | bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_METADATA;
    let info_: bundleManager.BundleInfo = bundleManager.getBundleInfoForSelfSync(bundleFlags)
    let kvManagerConfig: distributedKVStore.KVManagerConfig = {
      context: getContext(that),
      bundleName: info_.name
    };
    let kvManager: distributedKVStore.KVManager = distributedKVStore.createKVManager(kvManagerConfig)
    return new Promise((resolve: Function, reject: Function) => {
      try {
        const options: distributedKVStore.Options = {
          createIfMissing: true, // 当数据库文件不存在时是否创建数据库,默认创建
          encrypt: false, // 设置数据库文件是否加密,默认不加密
          backup: false, // 设置数据库文件是否备份,默认备份
          kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION, // 设置要创建的数据库类型,默认为多设备协同数据库
          securityLevel: distributedKVStore.SecurityLevel.S2 // 设置数据库安全级别
        };
        // storeId为数据库唯一标识符
        kvManager.getKVStore('storeId', options, (err, kvStore: distributedKVStore.SingleKVStore) => {
          if (err) {
            console.error(`Failed to get KVStore. Code:${err.code},message:${err.message}`);
            reject('err')
            return;
          }
          console.info('Succeeded in getting KVStore.');

          // 进行相关数据操作
          resolve(kvStore)
        });
      } catch (e) {
        reject('err')
        console.error(`An unexpected error occurred. Code:${e.code},message:${e.message}`);
      }
    })
  }

  getItem(value: string): Promise<string | Object | number | boolean | null | undefined> {
    return new Promise((resolve: Function, reject: Function) => {
      //用户首选项操作
      preferences.getPreferences(getContext(this), 'myStore').then((obj: preferences.Preferences) => {
        obj.has(value).then(async (isExit: Boolean) => {
          // console.info('isExit:' + isExit)
          if (!isExit) {
            resolve('')
          } else {
            let res: preferences.ValueType = await obj.get(value, '');
            // console.log(res+'454545'+value)
            resolve(res)

          }
        }).catch((err: Error) => {
          reject(JSON.stringify(err))
        })
      }).catch((err: Error) => {
        reject(JSON.stringify(err))
      })
    })
  }

  setItem(value: string, data: preferences.ValueType): Promise<null> {
    return new Promise((resolve: Function) => {
      preferences.getPreferences(getContext(this), 'myStore').then((obj: preferences.Preferences) => {
        obj.has(value).then(async (isExit: Boolean) => {
          // console.info('isExit:' + isExit)
          obj.put(value, data)
          obj.flush()
          resolve(null)

        })
      })
    })
  }

  clearItem(): Promise<null> {
    return new Promise((resolve: Function) => {
      preferences.deletePreferences(getContext(this), 'myStore', (err: BusinessError) => {
        if (err) {
          console.error("Failed to delete preferences. code =" + err.code + ", message =" + err.message);
          return;
        }
        resolve(null)
        console.info("Succeeded in deleting preferences.");
      })

    })
  }

  //启用键值对数据库处理
  getBigItem(value: string): Promise<string> {
    return new Promise((resolve: Function) => {
      this.getKvStore().then((kvStore: distributedKVStore.SingleKVStore) => {
        try {
          kvStore.get(value, (err, data) => {
            if (err !== undefined) {
              console.error(`Failed to get data. Code:${err.code},message:${err.message}`);
              resolve('')
              return;
            }
            // console.info(`Succeeded in getting data. data:${data}`);
            resolve(data)
          });
        } catch (e) {
          let error = e as BusinessError;
          console.error(`An unexpected error occurred. Code:${error.code},message:${error.message}`);
          resolve('')
        }

      })
    })
  }

  //设置值
  setBigItem(value: string, data: string): Promise<string> {
    return new Promise((resolve: Function) => {
      this.getKvStore().then((kvStore: distributedKVStore.SingleKVStore) => {

        try {
          kvStore.put(value, data, (err) => {
            if (err !== undefined) {
              console.error(`Failed to put data. Code:${err.code},message:${err.message}`);
              resolve('')
              return;
            }
            resolve('success')
            console.info('Succeeded in putting data.');
          });
        } catch (e) {
          let error = e as BusinessError;
          console.error(`An unexpected error occurred. Code:${error.code},message:${error.message}`);
          resolve('')
        }
      })
    })
  }

  //删除
  deleteBigItem(value: string): Promise<string> {
    return new Promise((resolve: Function) => {
      this.getKvStore().then((kvStore: distributedKVStore.SingleKVStore) => {

        kvStore.delete(value, (err) => {
          if (err !== undefined) {
            console.error(`Failed to delete data. Code:${err.code},message:${err.message}`);
            resolve('')
            return;
          }
          resolve('success')
          console.info('Succeeded in deleting data.');
        })
      })
    })
  }
}

export const localStorage=new LocalStorage()

使用

//引用,这个不得不说DevEco Studio是真心方便,上面文件方法写完导出后,代码中使用时可以直接输入方法名会给出提示,并自动给你import上,不用再自己写路径。这个功能真心好评!
import { localStorage } from '../../until/GlobalContext';


//这里是在你的需求里面去使用,比如我在输入完手机号之后需要保存手机号,当然,可以存字符串,对象等,见GlobalContext.ets
//存数据
localStorage.setItem('mobile',this.mobile)//一定要注意这是个异步函数,如果你需要在这执行完成后再执行其他操作,一定要异步处理!
//拿数据
localStorage.getItem('mobile').then((data)=>{
  console.log(JSON.stringify(data))
  if(typeof data=='string')this.mobile=data
})
//或(函数为异步函数时)
let mobile=await localStorage.getItem('mobile') 
if(typeof mobile=='string')this.mobile=mobile

其中调用clearItem 会删除所有用户首选项的数据

//一下是键值对数据处理的封装,处理超过8K数据的信息
getBigItem 
setBigItem
deleteBigItem//这里只会删除对应的数据,不会全部删除,所以要传一个值去确定删哪个数据

以上就是完整使用方法。仅供参考,自测实用,(用户首选项需要在真机调试下才能查看到数据,预览器不支持)