鸿蒙物联网开发教程-第九章 数据存储2
实例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)
}
}
}
更多推荐


所有评论(0)