首页 > 其他分享 >鸿蒙HarmonyOS NEXT开发:数据持久化方案解析与实践

鸿蒙HarmonyOS NEXT开发:数据持久化方案解析与实践

时间:2024-11-21 21:19:46浏览次数:3  
标签:持久 string 鸿蒙 NEXT onClick HarmonyOS num key rdb

(一)PersistentStorage 实现应用持久化数据管理

功能概述

        通过 PersistentStorage 类可管理应用持久化数据,能将特定标记的持久化数据链接到 AppStorage 中,再由 AppStorage 接口访问对应数据。持久化后的数据会生成本地 xml 文件保存,文件路径为 /data/app/el2/100/base/<bundleName>/haps/<hapName>/files/persistent_storage。

特性

  • 自动同步:PersistentStorage 会自动和 AppStorage 中数据同步。

  • 持久化存储:存储的数据为持久化存储。

  • 初始值设置:使用 PersistentStorage.PersistProp (' 属性名 ', 初始值) 设置初始值时,只有第一次会生效。

代码示例及步骤

首先,进行持久化数据的设置
        在以下代码中,我们使用 PersistentStorage.persistProp 来设置持久化数据。这里我们设置了一个名为 'num' 的属性,初始值为 0。这一步是创建持久化数据的关键。

// 持久化模块,设置键值及初始化的值
PersistentStorage.persistProp('num',0) 

然后,在组件中绑定持久化数据
        在 @Entry 装饰的组件中,我们使用 @StorageLink('num') 来将组件中的 num 属性与之前设置的持久化数据 'num' 进行绑定。这样,组件中的数据变化会反映到持久化存储中。

@Entry
@Component
struct Index {
    // 绑定模块,使用AppStoage的API,如@StorageLink(键)、@StorageProp(键)修饰,使用AppStoage.get、AppStoage.set等方法调用
    @StorageLink('num') num :number = 0 
    build() {
        RelativeContainer() {
            Text(this.num.toString())
              .onClick(() => {
                    this.num++
                })
              .fontSize(50)
              .fontWeight(FontWeight.Bold)
              .alignRules({
                    center: { anchor: '__container__', align: VerticalAlign.Center },
                    middle: { anchor: '__container__', align: HorizontalAlign.Center }
                })
        }
      .height('100%')
      .width('100%')
    }
}

 完整代码:

// 代码示例
PersistentStorage.persistProp('num',0)      // 持久化模块,参数1:键, 参数2:初始化的值

@Entry
@Component
struct Index {
   // 绑定模块 使用AppStoage的API,如@StorageLink(键)、@StorageProp(键)修饰,使用AppStoage.get、AppStoage.set等方法调用

  @StorageLink('num') num :number = 0 
  build() {
    RelativeContainer() {
      Text(this.num.toString())
        .onClick(() => {
          this.num++
        })
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
    }
    .height('100%')
    .width('100%')
  }
}

(二)用户首选项持久化

功能概述

为应用提供 Key-Value 键值型的数据处理能力,支持应用持久化轻量级数据,并可对其进行修改和查询。

操作步骤

  • 创建实例:需先创建用户首选项持久化实例存放到磁盘目录中,通过 preferences.getPreferencesSync (getContext (),{name:'xxx'}) 来创建,其中参数 1 为"上下文",参数 2 为与 Preferences 实例相关的配置选项,name 为必填参数,指 Preferences 实例的名称。
  • 修改数据:使用实例对象中的 putSync (key, 数据) 方法实现数据修改,有则改、无则加。
  • 获取数据:通过 getSync (key, 默认值) 方法可获取对应的值,当 key 不存在时,则得到的值为默认值。
  • 删除数据:调用 deleteSync (key) 方法可实现删除该键的数据。
  • 刷盘同步:对实例进行操作后需要调用 flush () 方法进行刷盘,才会同步到本地磁盘。

封装工具类完整代码:

// 封装用户首选项持久化的工具类
import { preferences } from "@kit.ArkData";

export class preferencesUtil<T extends preferences.ValueType>{
    private pre: preferences.Preferences
    // 构造函数进行初始化,传name参数
    constructor(name: string) {
        this.pre = preferences.getPreferencesSync(getContext(),{name:name})
    }
    // 增、改 键-值
    put(key:string, value:T):T{
        this.pre.putSync(key,value)
        this.pre.flush()
        return value
    }
    // 查  键-默认值(查不到返回的为默认值)
    get(key:string, value:T):T{
        return this.pre.getSync(key,value) as T
    }
    // 删  键
    del(key:string){
        this.pre.deleteSync(key)
        this.pre.flush()
    }
}

测试代码示例

// 测试代码
import { preferencesUtil } from '../preferencesUtil'

@Entry
@Component
struct Index {
    // 实例化用户首选项工具 
    pre = new preferencesUtil<number>('xxx')
    // 获取首次数据
    @State num :number = this.pre.get('xxx',0)

    build() {
        Column() {
            Text(this.num.toString())
            Button('加一')
               .onClick(()=>{
                    // 更新数据
                    this.num = this.pre.put('xxx', ++this.num)
                })
        }
       .height('100%')
       .width('100%')
    }
}

(三)数据库持久化(基于关系型数据库)

功能概述

        关系型数据库(Relational Database,RDB)基于 SQLite 组件提供了一套完整的对本地数据库进行管理的机制,对外提供一系列增、删、改、查等接口,也可直接运行用户输入的 SQL 语句来满足复杂场景需要。

官方网址

官方链接

封装工具类及测试代码示例

import { relationalStore, ValuesBucket } from "@kit.ArkData";
// 定义数据的结构
export interface IRdb extends ValuesBucket{
  id:number
  title:string
  content:string
}

export class RDBUtil{

  private tableName = 'rdbName'
  store: relationalStore.RdbStore | undefined = undefined;

  // 初始化
  async init(){
    const store = await relationalStore.getRdbStore(getContext(), {
      // 数据库的名
      name: 'databaseName.db',
      // 安全级别
      securityLevel: relationalStore.SecurityLevel.S1
    })
    // 定义数据库的表
    store.executeSql(`
        CREATE TABLE IF NOT EXISTS ${this.tableName} (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          title TEXT NOT NULL,
          content TEXT NOT NULL
        )
      `)
    this.store = store
  }

  // 增
  async addSql(title:string, content:string){
    this.store?.executeSql(
      `
      INSERT INTO ${this.tableName} (id, title, content)
      VALUES (null, '${title}', '${content}')
      `
    )
  }

  // 删
  async delSqlById(id:number){
    this.store?.executeSql(`
    DELETE FROM ${this.tableName} WHERE id = ${id};
    `)
  }

  // 改
  async updateSql(id:number, title:string, content:string){
    this.store?.executeSql(`
    UPDATE ${this.tableName}
    SET title = '${title}', content = '${content}'
    WHERE id = ${id}
    `)
  }

  // 查
  async getSql(){
    let dataIndex = this.store?.querySqlSync(`
    SELECT * FROM ${this.tableName}
    `)
    let list:IRdb[] = []
    while (dataIndex?.goToNextRow()){
      list.push(dataIndex.getRow() as IRdb)
    }
    dataIndex?.close()
    return list
  }

}
// 测试代码
import { IRdb, RDBUtil } from '../utils/RDBUtil'

@Entry
@Component
struct Index {
  @State list:IRdb[] = []
  rdb = new RDBUtil()
  aboutToAppear(): void {
    this.rdb.init()
  }
  build() {
    Column() {
      Text(JSON.stringify(this.list,null,2))
      Button('加')
        .onClick(()=>{
          this.rdb.addSql('xx','yyy')
        })
      Button('删')
        .onClick(async ()=>{
          await this.rdb.delSqlById(5)
        })
      Button('改')
        .onClick(()=>{
          this.rdb.updateSql(1,'jjj','ttt')
        })
      Button('查')
        .onClick(async () => {
          this.list = await this.rdb.getSql()
        })
    }
    .height('100%')
    .width('100%')
  }
}

注意事项

使用 SQL 语句存在一个 bug,即增、删、改之后不能立刻查到处理后的结果。解决方法可以是延迟查询或者查询官网看是否有不使用 SQL 语句的替代方式。例如以下代码情况:

// 如 一下代码,不能立刻得到处理后的结果,处理方法延迟或查询官网不使用SQL语句
Button('加')
  .onClick(async ()=>{
    this.rdb.addSql('xx','yyy')
    this.list = await this.rdb.getSql()
  })
Button('删')
  .onClick(async ()=>{
    await this.rdb.delSqlById(5)
    this.list = await this.rdb.getSql()
  })
Button('改')
  .onClick(async ()=>{
    this.rdb.updateSql(1,'jjj','ttt')
    this.list = await this.rdb.getSql()
  })

标签:持久,string,鸿蒙,NEXT,onClick,HarmonyOS,num,key,rdb
From: https://blog.csdn.net/weixin_63484971/article/details/143894031

相关文章

  • 鸿蒙NEXT开发案例:血型遗传计算
     【引言】血型遗传计算器是一个帮助用户根据父母的血型预测子女可能的血型的应用。通过选择父母的血型,应用程序能够快速计算出孩子可能拥有的血型以及不可能拥有的血型。这个过程不仅涉及到了简单的数据处理逻辑,还涉及到UI设计与交互体验的设计。【环境准备】•操作系统:Win......
  • 鸿蒙5.0南向开发:HiChecker开发指导
     鸿蒙NEXT开发实战往期必看文章:一分钟了解”纯血版!鸿蒙HarmonyOSNext应用开发!“非常详细的”鸿蒙HarmonyOSNext应用开发学习路线!(从零基础入门到精通)HarmonyOSNEXT应用开发案例实践总结合(持续更新......)HarmonyOSNEXT应用开发性能优化实践总结(持续更新......)概述Hi......
  • 鸿蒙5.0南向开发:HiDumper开发概述
     鸿蒙NEXT开发实战往期必看文章:一分钟了解”纯血版!鸿蒙HarmonyOSNext应用开发!“非常详细的”鸿蒙HarmonyOSNext应用开发学习路线!(从零基础入门到精通)HarmonyOSNEXT应用开发案例实践总结合(持续更新......)HarmonyOSNEXT应用开发性能优化实践总结(持续更新......)功能简......
  • 鸿蒙5.0南向开发:HiSysEvent工具
     鸿蒙NEXT开发实战往期必看文章:一分钟了解”纯血版!鸿蒙HarmonyOSNext应用开发!“非常详细的”鸿蒙HarmonyOSNext应用开发学习路线!(从零基础入门到精通)HarmonyOSNEXT应用开发案例实践总结合(持续更新......)HarmonyOSNEXT应用开发性能优化实践总结(持续更新......)概述目......
  • 鸿蒙项目实战(六):HMRouter实现两次返回退出应用
    1、定义一个生命周期类ExitAppLifecycle实现IHMLifecycle接口import{HMLifecycle,HMLifecycleContext,IHMLifecycle}from'@hadss/hmrouter';@HMLifecycle({lifecycleName:'ExitAppLifecycle'})exportclassExitAppLifecycleimplementsIHMLifecycle{......
  • 鸿蒙NEXT开发案例:简体繁体转换器
    【引言】简体繁体转换器是一个实用的小工具,它可以帮助用户轻松地在简体中文和繁体中文之间进行转换。对于需要频繁处理两岸三地文档的用户来说,这样的工具无疑是提高工作效率的好帮手。本案例将展示如何利用鸿蒙NEXT提供的组件和服务,结合第三方库@nutpi/chinese_transverter,来实......
  • HarmonyOS Next企业级数据安全防护实战:加解密技术综合应用
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在企业级数据安全防护中加解密技术的综合应用,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、......
  • HarmonyOS Next加解密算法开发实践与优化策略
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)中加解密算法开发的实践经验与优化策略,基于实际开发案例进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、加解密......
  • HarmonyOS Next加解密算法中的参数与模式详解
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)中加解密算法参数与模式的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、加解密参数......
  • HarmonyOS Next智能家居系统安全加固:加解密技术的深度应用
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在智能家居系统安全加固中加解密技术的应用,基于实际开发经验进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、智......