【HarmonyOS Arkts笔记】@ohos.data.preferences用户首选项实现存储信息

本文介绍了Ohos框架中的PreferencesAPI,它支持应用存储和管理Key-Value形式的轻量级数据,包括数据的读写、初始化、删除和持久化。示例展示了如何使用putPreference和getPreference方法进行数据操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相关api

  • 用户首选项: 用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。
    数据存储形式为键值对,键的类型为字符串型,值的存储数据类型包括数字型、字符型、布尔型以及这3种类型的数组类型。

preferencesUtils.ts

import { preferences } from '@kit.ArkData';
import { BusinessError } from '@kit.BasicServicesKit';

let dataPreferences: preferences.Preferences | null = null;

const PreferenceUtil = {
  /*
  * 创建preference
   * */
  createPreferences() {
    preferences.getPreferences(this.context, 'myStore', (err: BusinessError, val: preferences.Preferences) => {
      if (err) {
        console.error("Failed to get preferences. code =" + err.code + ", message =" + err.message);
        return;
      }
      dataPreferences =  val;
      console.info("Succeeded in getting preferences.");
    })
  },
  /**
   * 获取preference对象
   */
  async getPreference(key: string) {
    if (!key) {
      return
    }
    if (!dataPreferences) {
      await PreferenceUtil.createPreferences();
    }

    await dataPreferences.get(key, '', (err: BusinessError, val: preferences.ValueType) => {
      if (err) {
        console.error("Failed to get value" + err.code + ", message =" + err.message);
        return;
      }
      console.log("Succeeded in getting value: " + val);
      return val;
    })
  },
  /**
   * 写入preference数据
   */
  async putPreference(key: string, val: string) {
    if (!key || !val) {
      return
    }
    if (!dataPreferences) {
      await PreferenceUtil.createPreferences();
    }

    await dataPreferences.put(key, val, async (err: BusinessError) => {
      if (err) {
        console.error("Failed to put value:" + err.code + ", message =" + err.message);
        return;
      }
      console.info("Succeeded in putting value: " + val);
      // 【数据持久化,写入文件】Store the Preference instance in the preference persistence file
      await dataPreferences.flush();
    })
  },
  /**
   * 删除preference数据
   */
  async delPreference(key: string) {
    if (!key) {
      return
    }
    if (!dataPreferences) {
      await PreferenceUtil.createPreferences();
    }
    await dataPreferences.delete(key, (err: BusinessError) => {
      if (err) {
        console.error("Failed to delete the key 'startup'. code =" + err.code + ", message =" + err.message);
        return;
      }
      console.info("Succeeded in deleting");
    })
  }
}

export default PreferenceUtil;

页面调用

import PreferenceUtil from '../../utils/preferencesUtils';

PreferenceUtil.putPreference('token', token)
PreferenceUtil.getPreference('token')
<think>好的,我现在需要帮用户解决在鸿蒙ArkTS中使用Axios实现大文件下载、暂停续传及监控进度的问题。首先,用户的需求很明确,想要完整的示例代码。我得先回忆一下鸿蒙开发的相关知识,特别是Axios在ArkTS中的使用。 首先,Axios在鸿蒙中通常用于HTTP请求,但大文件下载需要考虑分块下载和断点续传。用户提到了暂停和续传,这意味着需要管理下载状态,保存已下载的部分,以便恢复时继续下载。同时,监控进度需要实时更新,可能需要用到事件监听或者回调函数。 接下来,我需要考虑权限问题。根据引用[2],需要ohos.permission.INTERNET权限。所以代码示例中应该包含权限申请的部分,或者在配置文件中声明权限。不过用户可能已经知道这点,但最好还是在代码里提醒一下。 然后是分块下载的实现。这涉及到HTTP的Range头部,通过设置Range来请求文件的特定部分。同时,需要处理206 Partial Content响应。Axios是否支持设置请求头?应该可以,在配置对象中添加headers参数。例如,headers: { 'Range': 'bytes=' + start + '-' + end }。 断点续传需要保存已下载的字节数,可能在应用重启后还能读取。所以需要使用文件系统来存储临时文件和进度信息。鸿蒙的文件API,比如ohos.file.fs,可以用来读写文件。比如,每次下载一部分,就将数据追加到文件中,并记录当前的下载位置。 暂停功能可以通过取消HTTP请求来实现。Axios是否有取消请求的机制?通常可以使用CancelToken,但在鸿蒙的Axios实现中可能有所不同,需要查证。或者,用户可能需要自己管理请求的终止,比如在暂停时终止当前的Promise。 进度监控方面,Axios的onDownloadProgress事件可以用于监听下载进度。这个事件会提供已下载的字节数和总字节数,可以用来计算百分比。不过,在分块下载中,总字节数可能需要通过首次HEAD请求获取,或者从第一次分块请求的Content-Length头中获取。 现在,把这些整合成代码示例。首先,声明必要的变量,如文件URL、保存路径、当前下载位置、是否暂停等。然后,实现分块下载的函数,使用循环来逐个下载块。每个块下载后追加到文件中,并更新进度。暂停功能通过设置标志位,并在下载循环中检查该标志位,如果暂停则退出循环,并保存当前进度。 需要注意的是,文件操作和HTTP请求都是异步的,需要使用async/await来处理。另外,错误处理也很重要,比如网络中断、文件写入失败等,需要捕获异常并处理。 可能还需要考虑并发下载,但用户的问题中没有提到,所以暂时先实现单线程的分块下载。此外,临时文件的管理,比如下载完成后重命名,或者处理中断后的恢复,也需要在代码中体现。 最后,测试代码是否覆盖了所有功能点:开始下载、暂停、继续下载、进度更新、完成和错误处理。确保代码符合ArkTS的语法规范,比如使用EntryComponent、结构体等。 总结步骤: 1. 获取文件总大小,使用HEAD请求。 2. 初始化下载参数,如分块大小、临时文件、进度存储。 3. 分块下载循环,处理Range请求。 4. 实时更新进度并保存当前状态。 5. 处理暂停事件,保存已下载的字节数。 6. 下载完成后合并临时文件或重命名。 7. 错误处理和资源清理。 现在将这些步骤转化为具体的代码示例,同时添加注释说明关键部分,确保用户能够理解每一步的作用。可能还需要提醒用户在实际使用中替换URL和文件路径,以及处理权限和存储访问的问题。</think>以下是根据鸿蒙ArkTS特性实现的大文件下载管理方案,包含暂停续传和进度监控的核心代码实现: ### 大文件下载核心实现 ```typescript import axios from '@ohos/axios'; import fs from '@ohos.file.fs'; import common from '@ohos.app.ability.common'; // 下载状态管理类 class DownloadManager { private fileUrl: string = ''; // 文件URL private filePath: string = ''; // 本地存储路径 private downloadedSize: number = 0; // 已下载字节数 private totalSize: number = 0; // 文件总大小 private isPaused: boolean = false; // 暂停状态 private chunkSize: number = 1024 * 1024; // 分块大小(1MB) private tempFilePath: string = ''; // 临时文件路径 // 初始化下载任务 async initDownload(context: common.Context, url: string) { this.fileUrl = url; this.tempFilePath = context.cacheDir + '/tempfile.dat'; this.filePath = context.filesDir + '/downloaded_file.dat'; // 获取文件总大小 const response = await axios.head(this.fileUrl); this.totalSize = parseInt(response.headers['content-length']); } // 执行分块下载 async startDownload() { let startByte = this.downloadedSize; while (startByte < this.totalSize && !this.isPaused) { const endByte = Math.min(startByte + this.chunkSize, this.totalSize - 1); const response = await axios({ url: this.fileUrl, method: 'get', responseType: 'arraybuffer', headers: { 'Range': `bytes=${startByte}-${endByte}` }, onDownloadProgress: (progressEvent) => { const current = startByte + progressEvent.loaded; const percent = ((current / this.totalSize) * 100).toFixed(2); console.log(`下载进度: ${percent}%`); } }); // 追加写入文件 const file = fs.openSync(this.tempFilePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); fs.writeSync(file.fd, response.data, { offset: startByte }); fs.closeSync(file); startByte = endByte + 1; this.downloadedSize = startByte; } if (!this.isPaused) { fs.renameSync(this.tempFilePath, this.filePath); // 下载完成重命名 console.log('下载完成'); } } // 暂停下载 pauseDownload() { this.isPaused = true; // 持久化存储已下载大小(可使用Preferences存储) console.log('下载已暂停,当前进度:' + this.downloadedSize); } // 恢复下载 resumeDownload() { if (this.isPaused) { this.isPaused = false; this.startDownload(); } } } ``` ### 使用示例 ```typescript // 在EntryComponent中调用 @Entry @Component struct DownloadExample { private manager: DownloadManager = new DownloadManager(); async aboutToAppear() { await this.manager.initDownload(getContext(), 'https://example.com/largefile.zip'); } build() { Column() { Button('开始下载') .onClick(() => { this.manager.startDownload(); }) Button('暂停下载') .onClick(() => { this.manager.pauseDownload(); }) Button('继续下载') .onClick(() => { this.manager.resumeDownload(); }) } } } ``` 关键特性说明: 1. **分块下载**:通过HTTP Range头实现断点续传[^1] 2. **进度监控**:利用axios的onDownloadProgress事件回调 3. **状态持久化**:建议使用Preferences存储下载进度 4. **文件管理**:采用临时文件+最终重命名机制保证数据完整性 注意: 1. 需要申请网络权限:`ohos.permission.INTERNET`[^2] 2. 大文件建议使用流式处理优化内存占用 3. 实际开发中需添加异常处理机制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值