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

鸿蒙应用开发:数据持久化

最近在搞公司项目用到了鸿蒙端的数据持久化,特来跟大家分享一下。

在鸿蒙开发中,可以使用以下几个包来实现数据的持久化处理:

  • Data Ability

通过数据能力组件,开发者可以实现复杂的数据操作,包括增、删、改、查等功能。它允许不同的应用共享数据,并提供了统一的数据访问接口。

  • SQLite 

这是一个轻量级的关系型数据库,适用于本地存储。开发者可以使用 SQL 语句进行数据管理,支持事务处理,适合需要复杂查询的场景。

  • Preferences

适合存储简单的配置信息和用户偏好。通过键值对的方式存取数据,非常方便,尤其是在需要保存少量数据时。

  • File System 

直接操作文件系统,允许读写文件。这种方法灵活性高,适合存储大文件或非结构化数据,比如图片、音频等。

本次分享主要以用户首选项为例:在登陆页面输入个人信息后,点击“配置”后保存输入数据并且跳转到下一个页面,在第二个页面显示用户在登陆页输入的信息,并且支持登录页与显示页的数据同步。此外,登录页“退出”按钮绑定了应用关闭功能。

PreferenceModel.ets

import dataPreferences from '@ohos.data.preferences';
import promptAction from '@ohos.promptAction';
import { BusinessError } from '@ohos.base';
import showToast from './ShowToast';

let context = getContext(this);

let TAG:string = 'preference';



// 自定义用户首选项类
export class PreferenceModel {
  static preferences: dataPreferences.Preferences | null = null;

  /**
   * 初始化用户首选项类
   */
  public static initPre(){
    let options: dataPreferences.Options = { name: 'myStore.db' };
    PreferenceModel.preferences = dataPreferences.getPreferencesSync(context, options);
  }

  /**
   * 写入并保存数据
   * @param name - 键名
   * @param data - 键值
   */
  public static async writeData(name:string,data:string) {
    // Check whether the data is null.
    let isDataNull = PreferenceModel.checkData(data);
    if (isDataNull) {
      return;
    }
    // The data is inserted into the preferences database if it is not empty.
    PreferenceModel.preferences.putSync(name,data);

    // 使用flush方法将preferences实例的数据存储到持久化文件,调用用户首选项实例的flush接口
    await PreferenceModel.preferences.flush();
    // PreferenceModel.putPreference(name,data);
    showToast('保存成功!');
  }

  /**
   * 获取数据,返回字符串类型结果
   * @param name - 键名
   */
  public static getPreference(name:string) {
    let isExist: boolean = PreferenceModel.preferences.hasSync(name);
    if (isExist) {
      console.info(TAG + "The key 'startup' is contained.");
      let value: dataPreferences.ValueType = PreferenceModel.preferences.getSync(name, 'default');
      return value.toString().replace(/^"|"$/g, '');
    } else {
      console.info(TAG + "The key 'startup' dose not contain.");
      showToast('该值不存在!');
    }
  }

 
}

Register.ets

import router from '@ohos.router';
import { PreferenceModel } from '../common/PreferenceModel';
import { BusinessError } from '@ohos.base';
import common from '@ohos.app.ability.common';
import window from '@ohos.window';


@Entry
@Component
struct Register {

  @State ip:string = '';
  @State port:string = '';
  @State username:string = '';
  @State password:string = '';
  @State port_ftp:string = '';
  @State isFocused: boolean = false;


  context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext

  aboutToAppear(): void {
    // 设置不显示导航栏和状态栏
    window.getLastWindow(this.context).then((data) => {
      data.setWindowSystemBarEnable([]).then(() => {
        console.debug('Succeeded in setting the system bar to be invisible.');
      });
    });

    PreferenceModel.initPre()
    this.ip = PreferenceModel.hasPreference('register-ip')
          ? (PreferenceModel.getPreference('register-ip')).toString()
          : '10.0.1.182';
    this.port = PreferenceModel.hasPreference('register-port')
          ? (PreferenceModel.getPreference('register-port')).toString()
          : '1883';
    this.username = PreferenceModel.hasPreference('register-username')
          ? (PreferenceModel.getPreference('register-username')).toString()
          : 'username';
    this.password = PreferenceModel.hasPreference('register-password')
          ? (PreferenceModel.getPreference('register-password')).toString()
          : 'password';
    this.port_ftp = PreferenceModel.hasPreference('register-port-ftp')
          ? (PreferenceModel.getPreference('register-port-ftp')).toString()
          : '21';
  }

  build() {
    Stack({ alignContent: Alignment.TopStart }) {

      // 中间的内容部分
      Column({  }) {
        Column({ space:20 }){
          TextInput({text: this.ip})
            .backgroundColor('#FFFFFF')
            .focusable(this.isFocused)
            .textAlign(TextAlign.Center)
            .onChange((value:string)=>{
              this.ip = value
            })
            .onClick(()=>{
              this.isFocused = true
            })
          Divider()
            .margin({top:-25})

          TextInput({text: this.port})
            .backgroundColor('#FFFFFF')
            .focusable(this.isFocused)
            .textAlign(TextAlign.Center)
            .onChange((value:string)=>{
              this.port = value
            })
            .onClick(()=>{
              this.isFocused = true
            })
          Divider()
            .margin({top:-25})

          TextInput({text: this.username})
            .backgroundColor('#FFFFFF')
            .focusable(this.isFocused)
            .textAlign(TextAlign.Center)
            .onChange((value:string)=>{
              this.username = value
            })
            .onClick(()=>{
              this.isFocused = true
            })
          Divider()
            .margin({top:-25})

          TextInput({text: this.password})
            .backgroundColor('#FFFFFF')
            .focusable(this.isFocused)
            .textAlign(TextAlign.Center)
            .onChange((value:string)=>{
              this.password = value
            })
            .onClick(()=>{
              this.isFocused = true
            })
          Divider()
            .margin({top:-25})

          TextInput({text: this.port_ftp})
            .backgroundColor('#FFFFFF')
            .focusable(this.isFocused)
            .textAlign(TextAlign.Center)
            .expandSafeArea([SafeAreaType.KEYBOARD], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])
            .onChange((value:string)=>{
              this.port_ftp = value
            })
            .onClick(()=>{
              this.isFocused = true
            })
          Divider()
            .margin({top:-25})
        }
        .width('40%')
        .height('60%')
        .margin({top:px2vp(200)})

        Row({space:80}){
          Text("配置")
            .fontFamily('Source Han Sans CN-Regular')
            .fontSize(24)
            .fontColor('#262B2F')
            .fontWeight(400)
            .textAlign(TextAlign.Center)
            .width(130)
            .height(60)
            .borderRadius(10)
            .backgroundColor('#c1e6c6')
            .onClick(()=>{
              PreferenceModel.writeData('register-ip',JSON.stringify(this.ip))
              PreferenceModel.writeData('register-port',JSON.stringify(this.port))
              PreferenceModel.writeData('register-username',JSON.stringify(this.username))
              PreferenceModel.writeData('register-password',JSON.stringify(this.password))
              PreferenceModel.writeData('register-port-ftp',JSON.stringify(this.port_ftp))
              router.pushUrl({url: 'pages/Index'}).then(()=>{
              }).catch((err: BusinessError) => {
              })
            })
          Text("退出")
            .fontFamily('Source Han Sans CN-Regular')
            .fontSize(24)
            .fontColor('#262B2F')
            .fontWeight(400)
            .textAlign(TextAlign.Center)
            .width(130)
            .height(60)
            .borderRadius(10)
            .backgroundColor('#c1e6c6')
            .onClick(async ()=>{
              this.context.terminateSelf()
            })
        }
        .width(500)
        .height('30%')
        .justifyContent(FlexAlign.Center)
      }
      .width('94.6%')
      .height('92.2%')
      .backgroundColor('#FFFFFF')
      .borderRadius(30)
      .margin({left:"2.7%",top:"7.8%"})
      .alignItems(HorizontalAlign.Center)
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#2d2736')
  }
}

Index.ets

import { PreferenceModel } from '../common/PreferenceModel';

@Entry
@Component
struct Index {
  @State message: string[] = [];

  aboutToAppear(): void {
    PreferenceModel.initPre()
    this.message.push(PreferenceModel.getPreference('register-ip').toString());
    this.message.push(PreferenceModel.getPreference('register-port').toString());
    this.message.push(PreferenceModel.getPreference('register-username').toString());
    this.message.push(PreferenceModel.getPreference('register-password').toString());
    this.message.push(PreferenceModel.getPreference('register-port-ftp').toString());
  }
  build() {
    Row() {
      Column() {
        ForEach(this.message, (item, index)=>{
          Text(item)
            .fontSize(50)
            .fontWeight(FontWeight.Bold)
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}

效果

项目已上传gitee,感兴趣的家人不妨给个星星⭐ 


http://www.kler.cn/news/363628.html

相关文章:

  • 大模型系列——幻觉
  • Python CGI编程-get、post-复选框、单选框、文本框、下拉列表
  • 如何禁止上班期间浏览无关网站?
  • 网站前端登录加密方案调查
  • SSL证书有免费的吗?在哪里可以申请到?——附带申请步骤
  • VirtualBox虚拟机桥接模式固定ip详解
  • windows 上编译ceres suitesparse
  • #Swift 下标 Subscript - Access the elements of a collection
  • 【C++指南】运算符重载详解
  • 【JAVA毕设】基于JAVA的酒店管理系统
  • Flink SQL+Hudi数据入湖与分析实践
  • Scala的reduce
  • 昆虫种类识别数据集昆虫物种分类数据集YOLO格式VOC格式 目标检测 机器视觉数据集
  • 牛客周赛64(C++实现)
  • 你真的了解Canvas吗--解密十二【ZRender篇】
  • 【AI创新】优化ChatGPT提示词Prompt设计:释放AI的无限潜能
  • 使用AITemplate和AMD GPU的高效图像生成:结合Stable Diffusion模型
  • 数据结构(8.2_1)——插入排序
  • KOC营销崛起:怎样统计每个达人的App推广效果?
  • vscode连接keil-5 开发STM32 程序
  • Windows下搭建VUE开发环境
  • 一文搞定二叉树
  • 智慧楼宇平台,构筑未来智慧城市的基石
  • Vue入门示例
  • 【Docker】【Mini_Postgresql_Image】打造Mini版 Postgresql Docker镜像
  • 关于MyBatis的一些面试题