当前位置: 首页 > news >正文

开发中使用——鸿蒙本地存储之收藏功能

文章目录

  • 开发中使用——鸿蒙本地存储之收藏功能
  • 一、背景
  • 二、思路
  • 三、方案一
    • 1.准备工作
    • 2.解决什么时候存
    • 3.解决什么时候取
    • 4.如何存
    • 5.数据如何同步
    • 6.如何使用
    • 7.展示效果


开发中使用——鸿蒙本地存储之收藏功能

一、背景

一个本地应用,做一个收藏功能,要求收藏的内容,下次打开App的时候,还可以看到。

二、思路

本地缓存

  • 文件缓存:使用轻量级缓存SharedPreferences
  • 数据库缓存:sqlLite(后续会进行展开介绍)

三、方案一

轻量级缓存SharedPreferences的实现
首先要解决下面这几个问题,什么时候存、什么时候取,如何存,以及应用内数据如何同步的问题。

1.准备工作

我们需要有一个管理缓存的单例类,处理存、取、添加、修改、删除等操作。所以大概情况下,我们要先有下面这样一个结构的类,用来管理这一堆事情。

import { common } from '@kit.AbilityKit'
import { preferences } from '@kit.ArkData'
import { Country } from './DataModel'/*** 收藏数据管理*/
export class CollectDataManager {private static instance: CollectDataManager;public  collectItems: Array<Country> = []private  myStore:string = 'com.silence.flagCard';private itemsKey: string = 'flagCard'private static context: common.UIAbilityContext; // 应用上下文// 私有构造函数private constructor() {}// 初始化上下文(需在应用启动时调用)public static init(context: common.UIAbilityContext): void {CollectDataManager.context = context;}// 获取单例实例public static getInstance(): CollectDataManager {if (!CollectDataManager.instance) {if (!CollectDataManager.context) {throw new Error('Context not initialized! Call PreferencesUtil.init() first.');}CollectDataManager.instance = new CollectDataManager();}return CollectDataManager.instance;}/*** 加载缓存数据*/public async loadData() {}/*** 加载缓存数据*/public async loadData() {try {let pref = await preferences.getPreferences(CollectDataManager.context, this.myStore);let itemsJson = await pref.get(this.itemsKey, '');let itemsData = JSON.parse(itemsJson.toString()) as Array<Country>this.collectItems = itemsData;} catch (error) {console.error('加载数据失败:', error)this.collectItems = []}}/*** 保存缓存数据*/async saveData() {try {let itemsJson = JSON.stringify(this.collectItems)let pref = await preferences.getPreferences(CollectDataManager.context, this.myStore);await pref.put(this.itemsKey, itemsJson)await pref.flush()} catch (error) {console.error('保存数据失败:', error)}}/*** 更新数据* @param item*/updateItem(item: Country) {}/*** 删除数据* @param id*/deleteItem(id: number) {}/*** 获取所有收藏数据* @returns*/getAllItems(): Array<Country> {return this.collectItems}/*** 通过id获取收藏数据item* @returns*/getItemById(id: number): Country | undefined{return this.collectItems.find(item => item.id == id)}
}

2.解决什么时候存

应用销毁之前,要将收藏的数据存到缓存文件中。我是建议在入口EntryAbility中onDestroy()方法中存储数据。

  onDestroy(): void {hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onDestroy');/// 保存数据CollectDataManager.getInstance().saveData();}

3.解决什么时候取

应用打开的时候,要将缓存的数据取出来。在收藏页面展示出来。我是建议在入口EntryAbility中onCreate()中初始化数据管理的单例类和获取数据。

 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate');/// 初始化轻量级缓存CollectDataManager.init(this.context);CollectDataManager.getInstance().loadData();}

4.如何存

这里其实设计三个问题,添加数据、修改数据、删除数据。

  • 添加数据
  /*** 添加数据* @param item*/addItem(item: Country) {/// 需要去重处理if(this.getItemById(item.id)){return;}this.collectItems.push(item)this.saveData()}
  • 修改数据
  /*** 更新数据* @param item*/updateItem(item: Country) {// 判断是否存在const index = this.collectItems.findIndex(i => i.id === item.id)if (index !== -1) {this.collectItems[index] = itemthis.saveData()}}
  • 删除数据
  /*** 删除数据* @param id*/deleteItem(id: number) {// 判断是否存在const index = this.collectItems.findIndex(i => i.id === id)if (index !== -1) {this.collectItems.splice(index, 1)this.saveData()}}

5.数据如何同步

需要借助修饰词 @ObservedV2 对类进行装饰,对需要数据变化,全局UI变化的collectItems使用@Trace进行装饰。修改如下。

/*** 收藏数据管理*/
@ObservedV2
export class CollectDataManager {private static instance: CollectDataManager;@Tracepublic  collectItems: Array<Country> = []......

6.如何使用

  • 获取这个收藏列表
/*** 我的收藏页面*/
@Component
export struct CollectPage {// 获取收藏列表@State myCollectItems:Country[] = CollectDataManager.getInstance().collectItems;......
  • 添加/删除收藏列表的某一项数据
    先验证是否已经收藏,这个也是显示收藏按钮状态的一个状态变量。然后在用户点击收藏按钮时候,判断是否进行收藏或者取消收藏。
     /// 验证是已经收藏this.isFavorite = CollectDataManager.getInstance().getItemById(this.country.id) != undefined;if(this.isFavorite){CollectDataManager.getInstance().deleteItem(this.country.id);}else{CollectDataManager.getInstance().addItem(this.country);}

7.展示效果

http://www.dtcms.com/a/362912.html

相关文章:

  • webpack性能优化指南
  • 汽车制造工厂如何应用力控SCADA实现全方位智能监控与诊断
  • Spring Boot + Spring MVC 项目结构
  • Jenkins 拉取 Git 仓库时报错:there are still refs under ‘refs/remotes/origin/release‘
  • 在 Elasticsearch 中使用用户行为分析:使用 UBI 和 search-ui 创建一个应用程序
  • 【序列晋升】25 Spring Cloud Open Service Broker 如何为云原生「服务市集」架桥铺路?
  • 【JavaScript】前端两种路由模式,Hash路由,History 路由
  • UBUNTU之Onvif开源服务器onvif_srvd:2、测试
  • @Value注解底层原理(二)
  • 云端职达:你的AI求职专属猎头,颠覆传统招聘模式
  • 哈尔滨云前沿服务器托管与租用服务
  • STM32——串口
  • 在windows上使用ROS2 kilted
  • Pytorch Yolov11目标检测+window部署+推理封装 留贴记录
  • LeetCode算法日记 - Day 30: K 个一组翻转链表、两数之和
  • Unity核心概率④:MonoBehavior
  • @Hadoop 介绍部署使用详细指南
  • 从 WPF 到 Avalonia 的迁移系列实战篇6:ControlTheme 和 Style区别
  • R 语言科研绘图第 71 期 --- 散点图-边际
  • 小白也能看懂!“找不到 msvcp140.dll无法继续执行代码” 的6种简易解决方法,5 分钟快速修复
  • Watt Toolkit下载安装并加速GitHub
  • C# 原型模式(C#中的克隆)
  • 基因表达数据的K-M生存曲线的数据处理及绘制
  • Anaconda安装与使用详细教程
  • 服务器CPU飙高?排查步骤与工具推荐
  • 深入探索 HarmonyOS Stage 模型与 ArkUI:构建现代化、高性能应用
  • 【NestJS】HTTP 接口传参的 5 种方式(含前端调用与后端接收)
  • 面试新纪元:无声胜有声,让AI成为你颈上的智慧伙伴
  • 基于YOLO8的番茄成熟度检测系统(数据集+源码+文章)
  • 利用飞算Java打造电商系统核心功能模块的设计与实现