(一)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()
- })
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |