开源 Arkts 鸿蒙应用 开发(六)数据持久--文件和首选项存储

HarmonyOS鸿蒙开发指南:基于ArkTS开发 数据管理 关系型数据库 关系型数据库(Relational Database,RDB)是一种基于关系模型来管理数据的数据库。关系型数据库基于SQLite组件提供了一套完整的对本地数据库进行管理的机制,对外提供了一系列的增、删、改、查等接口,也可以直接运行用户输入的SQL语句来满足复杂的场景需要。当应用卸载后,其相关数据库会被自动清除。关于数据库锁机制,开发者无需关注其具体实现。关系型数据库是在SQLite基础上实现的本地数据操作机制,提供给用户无需编写原生SQL语句就能进行数据增删改查的方法,同时也支持原生SQL语句操作。 阅读详情

 文章的目的为了记录使用Arkts 进行Harmony app 开发学习的经历。本职为嵌入式软件开发,公司安排开发app,临时学习,完成app的开发。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。

 

 相关链接:

开源 Arkts 鸿蒙应用 开发(一)工程文件分析-优快云博客

开源 Arkts 鸿蒙应用 开发(二)封装库.har制作和应用-优快云博客

开源 Arkts 鸿蒙应用 开发(三)Arkts的介绍-优快云博客

开源 Arkts 鸿蒙应用 开发(四)布局和常用控件-优快云博客

开源 Arkts 鸿蒙应用 开发(五)控件组成和复杂控件-优快云博客

开源 Arkts 鸿蒙应用 开发(六)数据持久--文件和首选项存储-优快云博客

开源 Arkts 鸿蒙应用 开发(七)数据持久--sqlite关系数据库-优快云博客

开源 Arkts 鸿蒙应用 开发(八)多媒体--相册和相机-优快云博客

开源 Arkts 鸿蒙应用 开发(九)通讯--tcp客户端-优快云博客

开源 Arkts 鸿蒙应用 开发(十)通讯--Http-优快云博客

开源 Arkts 鸿蒙应用 开发(十一)证书和包名修改-优快云博客

开源 Arkts 鸿蒙应用 开发(十二)传感器的使用-优快云博客

开源 Arkts 鸿蒙应用 开发(十三)音频--MP3播放_arkts avplayer播放音频 mp3-优快云博客

开源 Arkts 鸿蒙应用 开发(十四)线程--任务池(taskpool)-优快云博客

开源 Arkts 鸿蒙应用 开发(十五)自定义绘图控件--仪表盘-优快云博客

开源 Arkts 鸿蒙应用 开发(十六)自定义绘图控件--波形图-优快云博客

开源 Arkts 鸿蒙应用 开发(十七)通讯--http多文件下载-优快云博客

开源 Arkts 鸿蒙应用 开发(十八)通讯--Ble低功耗蓝牙服务器-优快云博客

 推荐链接:

开源 java android app 开发(一)开发环境的搭建-优快云博客

开源 java android app 开发(二)工程文件结构-优快云博客

开源 java android app 开发(三)GUI界面布局和常用组件-优快云博客

开源 java android app 开发(四)GUI界面重要组件-优快云博客

开源 java android app 开发(五)文件和数据库存储-优快云博客

开源 java android app 开发(六)多媒体使用-优快云博客

开源 java android app 开发(七)通讯之Tcp和Http-优快云博客

开源 java android app 开发(八)通讯之Mqtt和Ble-优快云博客

开源 java android app 开发(九)后台之线程和服务-优快云博客

开源 java android app 开发(十)广播机制-优快云博客

开源 java android app 开发(十一)调试、发布-优快云博客

开源 java android app 开发(十二)封库.aar-优快云博客

推荐链接:

开源C# .net mvc 开发(一)WEB搭建_c#部署web程序-优快云博客

开源 C# .net mvc 开发(二)网站快速搭建_c#网站开发-优快云博客

开源 C# .net mvc 开发(三)WEB内外网访问(VS发布、IIS配置网站、花生壳外网穿刺访问)_c# mvc 域名下不可訪問內網,內網下可以訪問域名-优快云博客

开源 C# .net mvc 开发(四)工程结构、页面提交以及显示_c#工程结构-优快云博客

开源 C# .net mvc 开发(五)常用代码快速开发_c# mvc开发-优快云博客

本章节内容如下:

1.  文件存储

2.  首选项存储

一、文件读写,实现了按键将对话框数据对写入文件,按键读取文件数据到对话框。写入后,关闭app,重新打开后再读出,验证文件存取成功。

1.1  写入文件和读出文件代码

writeToFile() {
    try {
      let file = fs.openSync(this.filePath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
      fs.writeSync(file.fd, this.inputText);
      fs.closeSync(file.fd);
      this.outputText = '内容已成功写入文件';
      console.log('写入文件成功');
    } catch (error) {
      console.error(`写入文件失败: ${error.message}`);
      this.outputText = '写入文件失败';
    }
  }

  readFromFile() {
    try {
      if (!fs.accessSync(this.filePath)) {
        this.outputText = '文件不存在';
        return;
      }

      let file = fs.openSync(this.filePath, fs.OpenMode.READ_ONLY);
      let stat = fs.statSync(this.filePath);
      let arrayBuffer = new ArrayBuffer(stat.size);
      fs.readSync(file.fd, arrayBuffer);
      fs.closeSync(file.fd);

      // 使用循环将Uint8Array转换为字符串
      const uint8Array = new Uint8Array(arrayBuffer);
      let result = '';
      for (let i = 0; i < uint8Array.length; i++) {
        result += String.fromCharCode(uint8Array[i]);
      }
      this.outputText = result;
    } catch (error) {
      console.error(`读取文件失败: ${error.message}`);
      this.outputText = '读取文件失败';
    }
  }

1.2  界面代码

build() {
    Column({ space: 20 }) {
      TextInput({ placeholder: '请输入要保存的内容' })
        .width('90%')
        .height(60)
        .onChange((value: string) => {
          this.inputText = value;
        })

      Button('写入文件')
        .width('60%')
        .height(40)
        .onClick(() => {
          this.writeToFile();
        })

      TextInput({ placeholder: '文件内容将显示在这里', text: this.outputText })
        .width('90%')
        .height(60)


      Button('读取文件')
        .width('60%')
        .height(40)
        .onClick(() => {
          this.readFromFile();
        })
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }

1.3  \pages\index.ets代码

// MainAbility.ets
import common from '@ohos.app.ability.common';
import fs from '@ohos.file.fs';



@Entry
@Component
struct FileReadWriteExample {
  @State inputText: string = '';
  @State outputText: string = '';
  private context = getContext(this) as common.UIAbilityContext;
  private filePath: string = '';

  aboutToAppear() {
    this.filePath = this.context.filesDir + '/example.txt';

    console.log(`文件路径: ${this.filePath}`);
  }

  writeToFile() {
    try {
      let file = fs.openSync(this.filePath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
      fs.writeSync(file.fd, this.inputText);
      fs.closeSync(file.fd);
      this.outputText = '内容已成功写入文件';
      console.log('写入文件成功');
    } catch (error) {
      console.error(`写入文件失败: ${error.message}`);
      this.outputText = '写入文件失败';
    }
  }

  readFromFile() {
    try {
      if (!fs.accessSync(this.filePath)) {
        this.outputText = '文件不存在';
        return;
      }

      let file = fs.openSync(this.filePath, fs.OpenMode.READ_ONLY);
      let stat = fs.statSync(this.filePath);
      let arrayBuffer = new ArrayBuffer(stat.size);
      fs.readSync(file.fd, arrayBuffer);
      fs.closeSync(file.fd);

      // 使用循环将Uint8Array转换为字符串
      const uint8Array = new Uint8Array(arrayBuffer);
      let result = '';
      for (let i = 0; i < uint8Array.length; i++) {
        result += String.fromCharCode(uint8Array[i]);
      }
      this.outputText = result;
    } catch (error) {
      console.error(`读取文件失败: ${error.message}`);
      this.outputText = '读取文件失败';
    }
  }

  build() {
    Column({ space: 20 }) {
      TextInput({ placeholder: '请输入要保存的内容' })
        .width('90%')
        .height(60)
        .onChange((value: string) => {
          this.inputText = value;
        })

      Button('写入文件')
        .width('60%')
        .height(40)
        .onClick(() => {
          this.writeToFile();
        })

      TextInput({ placeholder: '文件内容将显示在这里', text: this.outputText })
        .width('90%')
        .height(60)


      Button('读取文件')
        .width('60%')
        .height(40)
        .onClick(() => {
          this.readFromFile();
        })
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }
}

1.4  演示

二、首选项读写

2.1  页面显示代码index.ets,实现显示3个按钮。

// index.ets
@Entry
@Component
struct Index {
  build() {
    Column() {
      Button('Button 1')
        .margin({ top: 10, bottom: 10 })
        .onClick(() => {
          // 通过全局对象调用Ability方法
          if (globalThis.entryAbility?.btn1) {
            globalThis.entryAbility.btn1();
          }
      })
        .width('100%')
      Row()
      Button('Button 2')
        .margin({ top: 10, bottom: 10 })
        .onClick(() => {
          if (globalThis.entryAbility?.btn2) {
            globalThis.entryAbility.btn2();
          }
        })
        .width('100%')

      Button('Button 3')
        .margin({ top: 10, bottom: 10 })
        .onClick(() => {
          if (globalThis.entryAbility?.btn3) {
            globalThis.entryAbility.btn3();
          }
        })
        .width('100%')
    }
    .width('100%')
    .height('100%')
  }
}

2.2  UIAbility的代码EntryAbility.ets,功能包括

初始化Preferences数据存储

提供三个按钮操作:

btn1(): 写入字符串、二进制数据和数字到Preferences

btn2(): 从Preferences读取并显示存储的数据

btn3(): 删除Preferences中的数据


Preferences操作
代码中提供了完整的Preferences CRUD操作:

初始化:initPreferences()异步方法

写入数据:btn1()使用putSync()同步写入三种类型数据、字符串、二进制数据(Uint8Array)、数字

读取数据:btn2()使用getSync()同步读取数据、使用TextDecoder解码二进制数据

删除数据:btn3()使用deleteSync()同步删除数据


Preferences同步/异步操作:

初始化使用异步getPreferences()

数据操作使用同步方法(putSync, getSync, deleteSync)

写入后调用flushSync()确保数据持久化

以下为代码

import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';


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

import { preferences } from '@kit.ArkData';
import { util } from '@kit.ArkTS';


const DOMAIN = 0x0000;
let dataPreferences: preferences.Preferences | null = null;

export default class EntryAbility extends UIAbility {
  // 初始化Preferences
  async initPreferences(): Promise<void> {
    try {
      let options: preferences.Options = { name: 'myStore' };
      dataPreferences = await preferences.getPreferences(this.context, options);
    } catch (err) {
      hilog.error(DOMAIN, 'testTag', 'Failed to get preferences. Cause: %{public}s', JSON.stringify(err));
    }
  }

  // 按钮1:写入数据
  btn1(): void {
    if (!dataPreferences) {
      console.error('click btn1 Preferences not initialized');
      return;
    }

    try {
      // 写入字符串
      dataPreferences.putSync('string_key', 'Hello ArkTS');

      // 写入Uint8Array
      let encoder = new util.TextEncoder();
      let uInt8Array = encoder.encodeInto("你好,ArkTS");
      dataPreferences.putSync('binary_key', uInt8Array);

      // 写入数字
      dataPreferences.putSync('number_key', 123);

      dataPreferences.flushSync();

      console.info('click btn1 Preferences Data written successfully');
    } catch (err) {
      console.error('click btn1 Preferences Failed to write data: ' + JSON.stringify(err));
    }
  }

  // 按钮2:读取数据
  btn2(): void {
    if (!dataPreferences) {
      console.error('click btn2 Preferences not initialized');
      return;
    }

    try {
      // 读取字符串
      let stringVal = dataPreferences.getSync('string_key', 'default');
      console.info('click btn2 Preferences String value: ' + stringVal);

      // 读取二进制数据
      let binaryVal = dataPreferences.getSync('binary_key', new Uint8Array(0));
      let decoder = new util.TextDecoder('utf-8');
      let decodedStr = decoder.decode(binaryVal as Uint8Array);
      console.info('click btn2 Preferences Binary value: ' + decodedStr);

      // 读取数字
      let numberVal = dataPreferences.getSync('number_key', 0);
      console.info('click btn2 Preferences Number value: ' + numberVal);
    } catch (err) {
      console.error('click btn2 Preferences Failed to read data: ' + JSON.stringify(err));
    }
  }

  // 按钮3:删除数据
  btn3(): void {
    if (!dataPreferences) {
      console.error('click btn3 Preferences not initialized');
      return;
    }

    try {
      dataPreferences.deleteSync('string_key');
      dataPreferences.deleteSync('binary_key');
      dataPreferences.deleteSync('number_key');
      console.info('click btn3 Preferences Data deleted successfully');
    } catch (err) {
      console.error('click btn3 Preferences Failed to delete data: ' + JSON.stringify(err));
    }
  }

  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');

    globalThis.abilityContext = this.context;
    globalThis.entryAbility = this;

    // 初始化Preferences
    this.initPreferences();
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    // Main window is created, set main page for this ability
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

    windowStage.loadContent('pages/Index', (err) => {
      if (err.code) {
        hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err));
        return;
      }
      hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.');
    });

    /*
    let options: preferences.Options = { name: 'myStore' };
    dataPreferences = preferences.getPreferencesSync(this.context, options);


    if (dataPreferences.hasSync('startup')) {
      console.info("The key 'startup' is contained.");
    } else {
      console.info("The key 'startup' does not contain.");
      // 此处以此键值对不存在时写入数据为例
      dataPreferences.putSync('startup', 'auto');
      // 当字符串有特殊字符时,需要将字符串转为Uint8Array类型再存储,长度均不超过16 * 1024 * 1024个字节。
      //let uInt8Array1 = new util.TextEncoder().encodeInto("~!@#¥%……&*()——+?");


      let encoder: util.TextEncoder = new util.TextEncoder();
      let uInt8Array1: Uint8Array = encoder.encodeInto("你好,ArkTS"); // 或 encode()

      dataPreferences.putSync('uInt8', uInt8Array1);
    }

    let val = dataPreferences.getSync('startup', 'default');
    console.info("The 'startup' value is " + val);
    // 当获取的值为带有特殊字符的字符串时,需要将获取到的Uint8Array转换为字符串
    let uInt8Array2 : preferences.ValueType = dataPreferences.getSync('uInt8', new Uint8Array(0));

    let textDecoder = util.TextDecoder.create('utf-8');
    val = textDecoder.decodeToString(uInt8Array2 as Uint8Array);




    console.info("The 'uInt8' value is " + val);

    */
  }

  onWindowStageDestroy(): void {
    // Main window is destroyed, release UI related resources
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground(): void {
    // Ability has brought to foreground
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onForeground');
  }

  onBackground(): void {
    // Ability has back to background
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onBackground');
  }
}

2.3  测试效果如下,测试了写入,读出,删除。删除后再读出则为空。

SAP 发货在途库存管理:POD确认差异下的2种后续调整方案对比 本文详细解析了SAP发货在途库存管理中POD确认差异后的财务调整方案,对比了移动类型417和555 T两种处理方式的适用场景及财务影响。通过实际案例说明如何优化POD流程,减少库存差异损失,提升供应链管理效率。特别适合SAP SD模块用户及供应链管理人员参考。 阅读详情

相关推荐

ROS实践(四)机器人SLAM建图(gmapping)

本文介绍了SLAM技术及其实现方法。SLAM(同步定位与地图构建)让机器人在未知环境中通过传感器数据自主定位并构建地图。文章详细讲解了激光雷达、RGBD相机等常用传感器,以及gmapping和map_server这两个ROS功能包的使用方法。重点阐述了SLAM建图实验步骤:配置gmapping节点参数、启动机器人仿真、运行gmapping节点、使用rviz可视化工具、通过键盘遥控机器人完成地图构建并保存。实验结果表明,该方法能有效实现机器人自主建图功能,为后续导航等应用奠定基础。

qq_1033275663的博客 4336

开源 Arkts 鸿蒙应用 开发(一)工程文件分析

本文记录了嵌入式开发工程师转型HarmonyOS应用开发的经历。主要介绍了使用ArkTS进行HarmonyOS应用开发的环境搭建和基础开发流程。内容包括:1) DevEco Studio 5.05开发工具安装;2) HarmonOS NEXT项目创建和工程文件结构解析;3) 开发首个Hello World应用,展示了UIAbility生命周期管理和UI组件使用。文章还提供了Java Android和C#.NET开发的相关参考链接,可作为多平台开发的辅助学习资料。作者通过实际项目经验总结了HarmonyOS应

ajassi2000的博客 1159

通俗傻瓜式理清光栅化渲染和光线追踪渲染的原理

用通俗语言傻瓜式的讲清楚光栅渲染和光线追踪渲染的原理,方便没有相关理论基础的朋友理解入门。

qq_37366618的博客 2万+

开源 Arkts 鸿蒙应用 开发(三)Arkts语言的介绍

摘要:本文记录嵌入式开发者转型HarmonyOS应用开发的ArkTS语言学习要点。主要涵盖三部分:1)基础语法(变量/常量声明、数字/字符串/对象/数组类型);2)控制结构与函数(for-of循环、函数重载);3)面向对象特性(类定义/继承、接口实现)。特别强调.har封装库的工程应用,并对比传统语言差异(如number类型统一处理整数/浮点)。文章附有详细代码示例和优快云系列教程链接,旨在快速掌握ArkTS核心语法,适合具备其他语言基础的开发者参考。

ajassi2000的博客 1153

鸿蒙OS开机动画背后的秘密:从代码到视觉的完整解析(附源码分析)

本文深入解析了鸿蒙OS开机动画的系统级实现原理。从bootanimation服务的启动配置、与Render Service的协同,到基于VSync信号的帧率同步与绘制流水线,结合OpenHarmony源码进行了逐行解读。文章揭示了其事件驱动的优雅退出机制,并探讨了视频支持、多屏适配等高级特性与定制化可能,为开发者理解鸿蒙图形子系统提供了硬核技术视角。

sony5的博客 972

AlphaFold-multimer 复合物结构预测

是DeepMind开发的AlphaFold项目的一个扩展,旨在预测蛋白质多聚体的三维结构。蛋白质多聚体是由多个蛋白质亚单位相互组装而成的结构,如酶、膜蛋白复合物和病毒颗粒。理解多聚体的结构对于揭示蛋白质的功能和相互作用非常重要。

MurphyStar的博客 5647

开源 Arkts 鸿蒙应用 开发(七)数据持久--sqlite关系数据库

本文记录了使用ArkTS进行HarmonyOS应用开发的学习过程,重点介绍了SQLite数据库操作。作者作为嵌入式开发人员临时转岗开发App,为防遗忘快速整理开发要点。文章详细讲解了如何创建SqliteHelper类实现数据库增删改查功能,并提供了完整的Index.ets页面代码示例,包括数据库初始化、数据添加、条件查询等操作。通过组合输入框、按钮和列表控件,实现了一个完整的联系人管理界面,展示了ArkTS开发HarmonyOS应用的基本流程和数据库操作方法。

ajassi2000的博客 1461

【STM32】STM32F407实现简单的Modbus协议

1.ModBus协议简介 MODBUS协议是一种串行通信协议,由Modicon公司(施耐德公司前身)发表,由于其公开发表且无版权要求,易于部署和维护,在工业界广泛应用。MODBUS采用主从通信(Master/Slave),MODBUS有三种报文格式:ASCII、RTU、TCP,本文主要讨论RTU。 如下图所示,串行通信上的MODBUS协议主要由地址,功能码,数据,CRC校验四部分数据帧构成。主机和从机的串行通信设备要求一致,参数要求一致,即假设使用串口,主从机波特率,奇偶校验...

BadBoyHolly的博客 8185

开源 Arkts 鸿蒙应用 开发(四)布局和常用控件

本文记录了嵌入式开发者临时学习ArkTs开发HarmonyOS应用的过程,主要总结了常用UI布局和控件的使用方法。重点介绍了线性布局(Row/Column)、弹性布局(Flex)、层叠布局(Stack)和栅格布局(Grid)的实现方式,并提供了Text、Button、TextInput等常用控件的综合应用示例。文章旨在为开发者提供快速上手的参考,同时附有相关技术博客链接供深入学习。通过具体代码示例展示了登录页面的实现方法,包括输入框、按钮、图片等组件的典型应用场景。

ajassi2000的博客 974

手把手教你学Simulink--Simulink智能驾驶场景挑战:高速公路入口匝道汇入仿真

高速公路入口匝道汇入在智能驾驶中的作用是当车辆从入口匝道进入主干道时,系统能够自主决策并执行汇入操作,确保安全和高效。目标识别与跟踪:如检测前方障碍物、识别车道线。路径规划:如计算最优汇入路径。动态控制:如调整速度、转向等以完成汇入动作。本示例将展示如何使用Simulink构建一个用于智能车辆高速公路入口匝道汇入的仿真模型,并进行验证。通过本指南,我们介绍了如何基于Simulink搭建一个用于智能车辆高速公路入口匝道汇入的仿真模型,并进行仿真和性能评估。背景介绍。

MHD0815的博客 263

ABAP SQL Hierarchy 全景参考,组织树、分类树与递归查询在数据库层的优雅落地

ABAP SQL中的hierarchy语法为树形数据结构处理提供了高效方案。S/4HANA系统中常见的成本中心、利润中心、物料分类等树形结构,传统开发需通过递归和嵌套循环处理,而ABAP SQL hierarchies通过将层级遍历能力下沉到SQL层,借助SAP HANA的层级函数支持,实现了更高效的查询。 该功能要求ABAP 7.51+版本,支持两种实现方式:CDS hierarchy用于创建可复用的稳定层级模型,适合业务核心数据;ABAP SQL HIERARCHY generator则适用于临时性层级

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 313

开源 Arkts 鸿蒙应用 开发(二)封装库.har制作和应用

2.1 需要注意library模块中的oh-package.json5配置文件,Index.ets文件是HAR导出声明文件的入口,HAR需要导出的接口,统一在Index.ets文件中导出。Index.ets文件是DevEco Studio默认自动生成的,用户也可以自定义,在模块的oh-package.json5文件中的main字段配置入口声明文件。3.4 在entryablity.ets中引入 classTest类,就可以调用它的函数了,从而实现封装库.har的应用。1. .har模块的制作。

ajassi2000的博客 1347

基于深度学习的柠檬等级检测系统 —— YOLOv8 + UI界面 + 数据集

本项目的目标是构建一个柠檬等级检测系统,通过深度学习模型自动检测柠檬的等级。自动检测柠檬等级:通过图像中的柠檬特征,自动判断其成熟度和质量。实时视频检测:通过摄像头实时监控柠檬的质量等级。用户友好的UI界面:为用户提供简洁直观的操作界面,支持图像上传、实时视频检测等功能。本项目展示了如何基于YOLOv8模型开发一个柠檬等级检测系统,结合PyQt5实现了用户友好的UI界面。通过该系统,用户可以快速上传柠檬图像并自动识别其等级,极大提升了检测效率和准确性。数据集的扩展。

YOLO 1112

开源 Arkts 鸿蒙应用 开发(十七)通讯--http多文件下载

本文记录了一个嵌入式开发者学习ArkTS开发HarmonyOS应用的过程,重点展示了一个多文件下载应用的实现。应用包含三个主要组件:MultipleFilesDownload主管理组件、FileDownloadItem下载项组件和ProgressButton进度按钮组件。文章详细解析了工程结构、各组件功能实现和交互逻辑,包括下载任务管理、进度显示、暂停/恢复功能等。同时提供了完整的代码示例和演示效果,并附带了相关权限配置说明和开源工程下载链接。该案例可作为HarmonyOS应用开发的参考模板。

ajassi2000的博客 1350

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

开源 Arkts 鸿蒙应用 开发(十三)音频--MP3播放

本文记录了基于ArkTS开发HarmonyOS音乐播放器的实践经验。作者作为嵌入式开发者临时转岗完成APP开发任务,通过本文整理关键实现细节以防遗忘。主要内容包括:1)使用AVPlayer实现音频播放全流程(创建实例、资源加载、播放控制);2)通过XComponent构建播放界面,支持进度条、倍速调节等功能;3)采用LocalStorage实现组件间数据共享。文中详细分析了List.ets(音乐列表)、Index.ets(播放控制)和App.ets(数据共享)三个核心文件,并提供了完整的代码实现。该项目实现

ajassi2000的博客 1334

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

开源 Arkts 鸿蒙应用 开发(十二)传感器的使用

本文记录了使用ArkTS开发HarmonyOS传感器应用的过程。作者作为嵌入式开发者临时学习移动开发,通过获取传感器列表、设置权限(加速度计、陀螺仪等)和建立监听,实现了三轴数据的实时采集与显示。核心代码展示了传感器初始化、数据监听和UI显示逻辑,采用卡片式布局呈现加速度、磁力和陀螺仪数据。文中包含完整的权限配置说明、关键API调用方法和界面效果图,为HarmonyOS传感器开发提供了实用参考。该案例突出了从传感器获取到界面展示的全流程实现,适合快速入门HarmonyOS设备传感器开发。

ajassi2000的博客 1269

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

开源 Arkts 鸿蒙应用 开发(五)控件组成和复杂控件

摘要:本文记录了一名嵌入式开发者在公司任务驱动下学习ArkTS进行HarmonyOS应用开发的经验总结。文章重点剖析了ArkUI框架的核心开发技术,包括:1)控件组成结构(装饰器、UI描述、自定义组件等);2)页面路由实现方式;3)复杂控件开发实践(选项卡、列表视图)。通过代码示例详细演示了属性配置、事件绑定、条件渲染等关键技术点,并对比了HarmonyOS与Android在选项卡实现上的差异。作者特别强调了对开发要点进行及时记录的重要性,同时提供了系列相关技术博客链接作为延伸学习资源。(149字)

ajassi2000的博客 1347

开源 Arkts 鸿蒙应用 开发(九)通讯--tcp客户端

本文记录了使用ArkTS开发HarmonyOS TCP客户端应用的过程。作者作为一名嵌入式开发人员临时学习鸿蒙应用开发,通过修改module.json5文件配置网络权限,在Index.ets中实现核心功能:包括建立TCP连接、收发文本消息、显示通信状态和历史记录。关键代码展示了如何使用@ohos.net.socket模块进行网络通信,包括连接管理、数据收发和错误处理。应用支持设置服务器IP/端口,实时显示收发消息,并通过UI组件提供友好的交互界面。文中附有实际运行效果图,演示了客户端与网络调试助手服务端的通

ajassi2000的博客 9114

开源 Arkts 鸿蒙应用 开发(十一)证书和包名修改

本职为嵌入式软件开发,公司安排开发app,临时学习,完成app的开发。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。1.2 我对错误进行了查找,AI给出了解决办法,我按下图删文件,输入命令搞了3个小时没解决,头大了。执行重新构建项目,编译成功。1.1 我做好了一个ble的代码,有1个月没有用,再次打开以后编译,开始报错,本章内容主要是证书刷新和包名修改,很简单,但是没有遇到还是很费时间,记录一下。手机上装了多个app,需要修改不同的包名,否则会覆盖。1.3 我尝试了1个简单的办法,重新登录证书。

ajassi2000的博客 1073

开源 Arkts 鸿蒙应用 开发(十四)线程--任务池(taskpool)

本文记录了使用ArkTS开发HarmonyOS应用的学习过程,重点介绍了任务池(taskpool)的使用方法。主要内容包括:1. 通过@Concurrent装饰器实现并发任务执行;2. 使用taskpool管理多线程任务;3. 利用emitter实现线程间通信。文中提供了完整的示例代码,展示了复杂计算任务的执行、进度更新以及任务间消息传递的实现方式。该笔记旨在帮助嵌入式开发者快速掌握鸿蒙应用开发中的多线程编程技术。

ajassi2000的博客 1077

开源 Arkts 鸿蒙应用 开发(八)多媒体--相册和相机

本文记录了使用ArkTS开发HarmonyOS应用时实现多媒体功能的过程。作为嵌入式开发人员临时转岗学习,重点实现了相册选择、相机拍摄和图片保存功能。通过PhotoViewPicker和cameraPicker分别实现相册和相机调用,使用异步处理保存图片到应用沙箱目录。代码展示了完整的图片处理流程,包括URI获取、ImageSource创建、PixelMap转换和文件保存。文章还提供了运行效果展示和沙箱存储位置示意图,作为HarmonyOS应用开发学习笔记。

ajassi2000的博客 866

开源 Arkts 鸿蒙应用 开发(十六)自定义绘图控件--波形图

本文记录了作者作为嵌入式开发者在学习ArkTS开发HarmonyOS应用过程中的技术总结。文章重点介绍了基于ArkTS实现的心率监测应用开发案例,包含三个核心文件:入口文件Index.ets负责初始化心率数据和界面布局;HeartRate.ets组件展示心率数据(最大值、最小值、平均值等)并通过AppStorage实现数据同步;HeartRateGraph.ets组件使用Canvas绘制心率变化曲线图。项目展示了ArkTS在状态管理、组件封装和数据可视化方面的应用,适合HarmonyOS开发者参考学习。文章

ajassi2000的博客 1321

开源 Arkts 鸿蒙应用 开发(十八)通讯--Ble低功耗蓝牙服务器

本文记录了使用ArkTS进行HarmonyOS应用开发的完整学习过程,重点演示了一个BLE广播调试应用的实现。该应用通过蓝牙广播发送包含设备ID的心率数据,主要功能包括:1. 工程采用模块化结构,包含主界面、蓝牙广播管理、数据构造等组件;2. 实现蓝牙广播启停、GATT服务管理、连接状态监控等核心功能;3. 使用随机数模拟心率数据,并通过自定义协议封装数据包;4. 包含权限管理、输入验证、日志记录等辅助功能。文章详细解析了各模块的源码实现,并提供了演示效果和工程下载链接,同时还分享了作者从嵌入式开发转型移动

ajassi2000的博客 1331

开源 Arkts 鸿蒙应用 开发(十)通讯--Http数据传输

本文记录了使用ArkTS开发HarmonyOS应用的学习过程,重点介绍了如何通过HTTP请求获取并解析天气API数据。作者作为嵌入式开发者临时转岗开发App,详细记录了关键实现步骤:1)添加网络权限;2)创建HTTP实例发起GET请求;3)处理响应并解析JSON数据。示例代码展示了完整的实现流程,包括定义接口类型、构建UI界面、处理网络请求和错误情况。该文是作者ArkTS开发系列文章的第八章,此前已涵盖工程结构、组件封装、布局控件等主题,为开发者提供了实用的HarmonyOS应用开发参考。

ajassi2000的博客 582

开源 Arkts 鸿蒙应用 开发(十五)自定义绘图控件--仪表盘

本文记录了作者使用ArkTS开发HarmonyOS应用的学习过程,重点分享了模拟车速表应用的实现方法。文章详细解析了工程结构,包括主页面组件Index.ets和核心组件CanvasCom.ets的代码实现,展示了如何通过Canvas绘制表盘和指针,实现速度值到指针角度的映射。该应用使用两张图片资源作为表盘背景和指针,通过TimeChangeListener辅助类实现200ms定时刷新。源码中特别处理了速度范围(0-240)到表盘角度(225°-45°)的线性映射,并提供了完整的工程下载链接。本文适合鸿蒙应用

ajassi2000的博客 1250

#鸿蒙 NEXT 应用开发实战:用 ArkTS 打造喝水提醒 App(API 24 篇)

本文介绍了基于HarmonyOS NEXT和ArkTS开发喝水提醒App的全过程。作者针对现代人饮水不足的问题,分析了现有应用存在的平台绑定、通知干扰等问题,选择API 24版本作为开发目标,充分利用ArkTS严格模式的类型安全和性能优势。文章详细阐述了开发环境配置、核心需求分析(包括饮水记录、进度可视化、目标设置等五大功能),以及采用单页面+状态驱动的架构设计。该项目充分利用鸿蒙生态特性,打造轻量级、本地优先的喝水提醒解决方案,避免功能臃肿,专注于改善用户饮水习惯。

duluo133的博客 467
上一篇: 开源 python 应用 开发(四)python文件和系统综合应用
下一篇: 开源 Arkts 鸿蒙应用 开发(七)数据持久--sqlite关系数据库
ajassi2000
博客等级 码龄22年 2035粉丝 191原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值