【每日学点HarmonyOS Next知识】kvstore同步读取、sdk升级、AES解密、代码区域不随鼠标滚动、napi访问资源目录问题

168 阅读2分钟

1、用户首选项和kvstore都是异步保存和读取,有同步读取方式吗?

用户首选项和ohos.data.distributedKVStore (分布式键值数据库)设置和获取值,都是异步的吗,模拟器感觉还挺慢的(设置后,获取),有其他支持同步的kv数据保存方式吗?

用户首选项kvstore都是异步保存和读取,没有提供相关同步操作api。PersistentStorage是支持同步kv数据保存方式,持久化变量最好是小于2kb的数据,不要大量的数据持久化,因为PersistentStorage写入磁盘的操作是同步的,大量的数据本地化读写会同步在UI线程中执行,影响UI渲染性能。如果开发者需要存储大量的数据,建议使用数据库api

2、如何将项目的compileSdkVersion升级到api12?

build-profile.json5中目前为

“compileSdkVersion”: “4.1.0(11)”,
“compatibleSdkVersion”: “4.1.0(11)”,

SDK、模拟器、开发工具已经升级完成,但是项目如何升级至 api12

可以先在IDE上面创建一个新的工程,获取工程的Compile SDK 、 Compatible SDK版本号(如:5.0.0(12))。 然后前往项目中的build-profile.json5 文件修改 对应的参数如下

“compileSdkVersion”: “5.0.0(12)”,
“compatibleSdkVersion”: “5.0.0(12)”,

最后rebuild project 注意:hvigor-config.json5这个文件里面的内容,可能也要改变。如果编译报错,提示hvigor不对,可以根据IDE提示去修改成新版本。或者自己手动修改.

3、HarmonyOS AES 解密问题?

在 app内需要用到 aes 加解密,使用的是 Crypto Architecture Kit,加解密的代码差异其实并不大,我基本都抄的官方文档代码,加密已调通,但是解密会报错decoder.doFinal()的位置会报错

请参考如下demo:

import cryptoFramework from '@ohos.security.cryptoFramework';
import buffer from '@ohos.buffer';

function genIvParamsSpec() {
  let dataIv = convertStringToUint8Array('8NONwyJtHesysWpM')! //new Uint8Array(arr);
  let ivBlob: cryptoFramework.DataBlob = { data: dataIv };
  let ivParamsSpec: cryptoFramework.IvParamsSpec = {
    algName: "IvParamsSpec",
    iv: ivBlob
  };
  return ivParamsSpec;
}
// 加密消息
async function encryptMessagePromise(symKey: cryptoFramework.SymKey, plainText: cryptoFramework.DataBlob) {
  let cipher = cryptoFramework.createCipher('AES128|CBC|PKCS7');
  let iv = genIvParamsSpec();
  await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, iv);
  let cipherData = await cipher.doFinal(plainText);
  return cipherData;
}
// 解密消息
async function decryptMessagePromise(symKey: cryptoFramework.SymKey, cipherText: cryptoFramework.DataBlob) {
  let decoder = cryptoFramework.createCipher('AES128|CBC|PKCS7');
  let iv = genIvParamsSpec();
  await decoder.init(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, iv);
  let decryptData = await decoder.doFinal(cipherText);
  return decryptData;
}

async function genSymKeyByData(symKeyData: Uint8Array) {
  let symKeyBlob: cryptoFramework.DataBlob = { data: symKeyData };
  let aesGenerator = cryptoFramework.createSymKeyGenerator('AES128');
  let symKey = await aesGenerator.convertKey(symKeyBlob);
  console.info('convertKey success');
  return symKey;
}

async function aesCBC() {

  let keyData = convertStringToUint8Array('sgg45747ss223455')!
  let symKey = await genSymKeyByData(keyData);
  let message = "This is a test,just";
  let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) };
  let encryptText = await encryptMessagePromise(symKey, plainText);
  let decryptText = await decryptMessagePromise(symKey, encryptText);
  if (plainText.data.toString() === decryptText.data.toString()) {
    console.info('decrypt ok');
    console.info('decrypt plainText: ' + buffer.from(decryptText.data).

4、如何设置代码区域字体不随着鼠标滚动而放大缩小?

设置方式:左上角file->settings->Editor->General 中的第一行 Change font size with Ctrl+Mouse Wheel in 取消勾选后点击Apply就可以了。

5、HarmonyOS系统提供的rawfile napi接口只能访问resources目录下的资源,无法访问resources同级的lib目录?

rawfile就只能访问rawfile,其他目录需要从ts侧传或者自己拼接。