实例9-2:传感器数据存储
功能:创建一个传感器数据存储应用,使用数据库存储传感器数据。
项目概述 本项目是一个基于Harmony操作系统的传感器数据存储应用,展示了如何使用ArkTS语言实现关系型数据库的创建、数据插入和查询功能。通过本项目的学习,学生将掌握Harmony应用开发中的数据库编程、数据持久化和数据可视化等核心技能。
核心知识点
1.关系型数据库基础 RelationalStore模块:使用 @ohos.data.relationalStore 模块实现关系型数据库操作 数据库创建:使用 getRdbStore() 方法创建数据库,需要提供context和config参数 数据库配置:配置数据库名称和安全级别(SecurityLevel.S1) 表结构设计:使用SQL语句创建数据表,定义主键、字段类型和约束
2.数据库初始化 Context获取:使用 this.getUIContext().getHostContext()获取应用上下文 StoreConfig配置:配置数据库名称和安全级别 SQL执行:使用 executeSql() 方法执行建表语句 异常处理:使用try-catch捕获数据库初始化过程中的错误
3.数据插入操作 ValuesBucket:使用 relationalStore.ValuesBucket 类型定义要插入的数据 insert方法:使用 database.insert() 方法将数据插入到数据库表中 数据封装:将传感器数据封装为键值对对象 时间戳生成:使用 Date.now() 生成唯一的时间戳
4.数据查询操作 RdbPredicates:使用 relationalStore.RdbPredicates 构建查询条件 查询条件设置:使用 orderByDesc() 设置排序,limitAs() 设置返回数量 query方法:使用 database.query() 方法执行查询,指定查询列 结果集处理:使用 resultSet.goToNextRow() 遍历结果集,使用 getLong() 和 getDouble() 获取数据
5.状态管理 @State装饰器:使用 @State 装饰器管理传感器数据和查询结果 接口定义:定义 SensorData 接口规范数据结构 数组类型:使用 Array 类型存储查询结果 状态更新:数据变化时自动触发UI刷新
6.UI组件与数据展示 卡片式设计:为温度和湿度数据设计美观的卡片式展示界面 ForEach渲染:使用 ForEach 组件渲染数据列表 时间格式化:使用 new Date().toLocaleString() 格式化时间戳 数据精度:使用 toFixed() 方法控制数据显示精度
7.异步处理与错误管理 async/await:使用 async 和 await 关键字处理异步数据库操作 try-catch:使用 try-catch 结构捕获和处理数据库操作中的错误 错误日志:使用 console.error() 记录错误信息,便于调试 资源释放:使用 resultSet.close() 释放结果集资源。
开发实践
1.环境搭建:安装DevEco Studio 2. 权限配置:在配置文件中添加数据库访问权限 3. 界面设计:实现传感器数据展示和数据列表界面 4. 数据库初始化:创建数据库和数据表 5. 数据操作:实现数据的插入和查询功能 6. 错误处理:添加完善的错误处理和日志记录 7. 测试验证:测试数据保存和查询功能 学习目标 通过本项目的学习,学生将能够: 理解Harmony关系型数据库的基本原理和实现方式 掌握使用 @ohos.data.relationalStore 模块进行数据库操作 学会使用RdbPredicates构建查询条件 掌握数据插入、查询和结果集处理的方法 理解异步编程和错误处理的工作机制 实现传感器数据的持久化存储和可视化展示 编写规范、可靠的Harmony数据库应用代码 本项目是物联网专业学生学习Harmony数据库编程的理想实践案例,通过实际动手操作,学生可以将理论知识转化为实际技能,为未来的物联网应用开发打下坚实基础。
在这里插入图片描述
代码

import relationalStore from '@ohos.data.relationalStore'
import common from '@ohos.app.ability.common'

interface SensorData {
  timestamp: number
  temperature: number
  humidity: number
}

@Entry@Component
struct SensorDataStorage {
  @State temperature: number = 25.5
  @State humidity: number = 60
  @State storedData: Array<SensorData> = []
  private database: relationalStore.RdbStore | null = null

  async aboutToAppear() {
    // 初始化数据库
    await this.initDatabase()
    // 加载数据
    await this.loadData()
  }

  build() {
    Column({
      space: 20
    }) {
      Text('传感器数据存储')
        .fontSize(24)
        .fontWeight(FontWeight.Bold)
        .fontColor('#1976D2')
        .width('100%')
        .textAlign(TextAlign.Center)

      Row({
        space: 15
      }) {
        // 温度卡片
        Column({
          space: 10
        }) {
          Text('🌡️')
            .fontSize(40)
          Text('温度')
            .fontSize(16)
            .fontColor('#666')
          Text(`${this.temperature.toFixed(1)}°C`)
            .fontSize(24)
            .fontWeight(FontWeight.Bold)
            .fontColor('#FF5722')
        }
        .layoutWeight(1)
        .padding(20)
        .backgroundColor('#FFF3E0')
        .borderRadius(10)
        .alignItems(HorizontalAlign.Center)

        // 湿度卡片
        Column({
          space: 10
        }) {
          Text('💧')
            .fontSize(40)
          Text('湿度')
            .fontSize(16)
            .fontColor('#666')
          Text(`${this.humidity}%`)
            .fontSize(24)
            .fontWeight(FontWeight.Bold)
            .fontColor('#2196F3')
        }
        .layoutWeight(1)
        .padding(20)
        .backgroundColor('#E3F2FD')
        .borderRadius(10)
        .alignItems(HorizontalAlign.Center)
      }

      Row({
        space: 10
      }) {
        Button('刷新数据')
          .fontSize(16)
          .backgroundColor('#1976D2')
          .width(120)
          .height(40)
          .onClick(() => {
            this.updateSensorData()
          })

        Button('保存数据')
          .fontSize(16)
          .backgroundColor('#4CAF50')
          .width(120)
          .height(40)
          .onClick(() => {
            this.saveData()
          })
      }
      .width('100%')
      .justifyContent(FlexAlign.Center)

      // 存储的数据列表
      Column({
        space: 10
      }) {
        Text('存储的数据')
          .fontSize(18)
          .fontWeight(FontWeight.Bold)
          .fontColor('#333')
          .width('100%')

        ForEach(this.storedData, (item: SensorData) => {
          Row({
            space: 10
          }) {
            Text(new Date(item.timestamp).toLocaleString())
              .fontSize(14)
              .layoutWeight(1)
            Text(`${item.temperature.toFixed(1)}°C`)
              .fontSize(14)
              .width(80)
            Text(`${item.humidity}%`)
              .fontSize(14)
              .width(80)
          }
          .width('100%')
          .padding(10)
          .backgroundColor('#F5F5F5')
          .borderRadius(4)
        })
      }
      .width('100%')
      .height(200)
    }
    .width('100%')
    .height('100%')
    .padding(20)
  }

  async initDatabase() {
    try {
      const context = this.getUIContext().getHostContext() as common.Context
      const config: relationalStore.StoreConfig = {
        name: 'sensor_data.db',
        securityLevel: relationalStore.SecurityLevel.S1
      }
      this.database = await relationalStore.getRdbStore(context, config)

      // 创建表
      if (this.database) {
        await this.database.executeSql('CREATE TABLE IF NOT EXISTS sensor_data (id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp INTEGER, temperature REAL, humidity REAL)')
      }
    } catch (error) {
      console.error('初始化数据库失败:', error)
    }
  }

  updateSensorData() {
    // 模拟传感器数据
    this.temperature = 20 + Math.random() * 10
    this.humidity = 40 + Math.random() * 40
  }

  async saveData() {
    if (!this.database) return

    try {
      const valuesBucket: relationalStore.ValuesBucket = {
        timestamp: Date.now(),
        temperature: this.temperature,
        humidity: this.humidity
      }

      await this.database.insert('sensor_data', valuesBucket)
      console.log('数据已保存')

      // 重新加载数据
      this.loadData()
    } catch (error) {
      console.error('保存数据失败:', error)
    }
  }

  async loadData() {
    if (!this.database) return

    try {
      const predicates = new relationalStore.RdbPredicates('sensor_data')
      predicates.orderByDesc('timestamp')
      predicates.limitAs(10)
      
      const resultSet = await this.database.query(predicates, ['timestamp', 'temperature', 'humidity'])
      const data: Array<SensorData> = []

      while (resultSet.goToNextRow()) {
        data.push({
          timestamp: resultSet.getLong(0),
          temperature: resultSet.getDouble(1),
          humidity: resultSet.getDouble(2)
        })
      }

      resultSet.close()
      this.storedData = data
    } catch (error) {
      console.error('加载数据失败:', error)
    }
  }
}
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐