#跟着坚果学鸿蒙# HarmonyOS 5 启动DataAbility开发指南
·
一、DataAbility基本概念
在HarmonyOS 5中,DataAbility是一种特殊的能力,允许应用以统一的方式对外提供数据访问接口。它基于URI(统一资源标识符)机制,支持跨应用数据共享,同时保证数据安全。
DataAbility的核心特点包括:
- 标准化访问:通过URI标识数据资源
- 安全隔离:基于权限机制控制访问
- 多数据源支持:可封装数据库、文件等不同数据源
- 跨进程通信:支持应用间数据交互
二、DataAbility开发流程
1. 创建DataAbility
首先需要创建一个继承自DataAbility的类,并实现核心方法:
// DataAbilityDemo.ts
import dataAbility from '@ohos.data.dataAbility'
import relationalStore from '@ohos.data.relationalStore'
const DB_NAME = 'mydata.db'
const TABLE_NAME = 'user'
const DB_VERSION = 1
export default class DataAbilityDemo extends dataAbility.DataAbility {
private rdbStore: relationalStore.RdbStore | null = null
// 初始化数据库
async onInit(): Promise<void> {
try {
const config: relationalStore.StoreConfig = {
name: DB_NAME,
securityLevel: relationalStore.SecurityLevel.S1
}
this.rdbStore = await relationalStore.getRdbStore(this.context, config)
await this.createTable()
} catch (err) {
console.error(`Failed to init RdbStore. Code:${err.code},message:${err.message}`)
}
}
// 创建数据表
private async createTable(): Promise<void> {
const sql = `CREATE TABLE IF NOT EXISTS ${TABLE_NAME} (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
email TEXT
)`
await this.rdbStore?.executeSql(sql)
}
// 插入数据
async insert(uri: string, valueBucket: dataAbility.ValuesBucket): Promise<number> {
const result = await this.rdbStore?.insert(TABLE_NAME, valueBucket)
return result ?? -1
}
// 查询数据
async query(uri: string, columns: Array<string>, predicates: dataAbility.DataAbilityPredicates): Promise<dataAbility.ResultSet> {
const predicatesObj = predicates.getRdbPredicates(TABLE_NAME)
return await this.rdbStore?.query(predicatesObj, columns) as dataAbility.ResultSet
}
// 更新数据
async update(uri: string, valueBucket: dataAbility.ValuesBucket, predicates: dataAbility.DataAbilityPredicates): Promise<number> {
const predicatesObj = predicates.getRdbPredicates(TABLE_NAME)
return await this.rdbStore?.update(valueBucket, predicatesObj) ?? 0
}
// 删除数据
async delete(uri: string, predicates: dataAbility.DataPredicates): Promise<number> {
const predicatesObj = predicates.getRdbPredicates(TABLE_NAME)
return await this.rdbStore?.delete(predicatesObj) ?? 0
}
}
2. 配置DataAbility
在module.json5中注册DataAbility:
{
"module": {
"abilities": [
{
"name": "DataAbilityDemo",
"type": "data",
"uri": "dataability://com.example.myapplication.DataAbilityDemo",
"visible": true,
"exported": true
}
]
}
}
三、启动和使用DataAbility
1. 获取DataAbilityHelper
import dataAbility from '@ohos.data.dataAbility'
import relationalStore from '@ohos.data.relationalStore'
let dataAbilityHelper: dataAbility.DataAbilityHelper
const URI = 'dataability://com.example.myapplication.DataAbilityDemo'
// 获取DataAbilityHelper实例
dataAbilityHelper = dataAbility.createDataAbilityHelper(this.context, URI)
2. 完整示例:用户数据管理
下面是一个完整的页面示例,展示如何使用DataAbility进行CRUD操作:
// UserManagementPage.ets
@Entry
@Component
struct UserManagementPage {
@State users: Array<User> = []
@State name: string = ''
@State age: string = ''
@State email: string = ''
private dataAbilityHelper: dataAbility.DataAbilityHelper | null = null
aboutToAppear() {
this.initDataAbility()
this.queryAllUsers()
}
// 初始化DataAbility连接
private initDataAbility() {
try {
this.dataAbilityHelper = dataAbility.createDataAbilityHelper(
getContext(this),
'dataability://com.example.myapplication.DataAbilityDemo'
)
} catch (err) {
console.error(`Failed to create DataAbilityHelper. Code:${err.code},message:${err.message}`)
}
}
// 查询所有用户
private queryAllUsers() {
const predicates = new dataAbility.DataAbilityPredicates()
predicates.equalTo('id', '*') // 查询所有记录
this.dataAbilityHelper?.query(
'dataability://com.example.myapplication.DataAbilityDemo/user',
['id', 'name', 'age', 'email'],
predicates
).then((resultSet) => {
this.processResultSet(resultSet)
}).catch((err) => {
console.error(`Query failed. Code:${err.code},message:${err.message}`)
})
}
// 处理查询结果
private processResultSet(resultSet: dataAbility.ResultSet) {
let tempUsers: Array<User> = []
if (resultSet.rowCount > 0) {
while (resultSet.goToNextRow()) {
tempUsers.push({
id: resultSet.getLong(resultSet.getColumnIndex('id')),
name: resultSet.getString(resultSet.getColumnIndex('name')),
age: resultSet.getLong(resultSet.getColumnIndex('age')),
email: resultSet.getString(resultSet.getColumnIndex('email'))
})
}
}
this.users = tempUsers
}
// 添加用户
private addUser() {
const valueBucket = {
'name': this.name,
'age': parseInt(this.age),
'email': this.email
}
this.dataAbilityHelper?.insert(
'dataability://com.example.myapplication.DataAbilityDemo/user',
valueBucket
).then(() => {
this.queryAllUsers()
this.clearInputs()
}).catch((err) => {
console.error(`Insert failed. Code:${err.code},message:${err.message}`)
})
}
// 清空输入
private clearInputs() {
this.name = ''
this.age = ''
this.email = ''
}
build() {
Column() {
// 输入表单
TextInput({ placeholder: 'Name' })
.width('90%')
.height(40)
.onChange((value: string) => { this.name = value })
TextInput({ placeholder: 'Age' })
.width('90%')
.height(40)
.onChange((value: string) => { this.age = value })
TextInput({ placeholder: 'Email' })
.width('90%')
.height(40)
.onChange((value: string) => { this.email = value })
Button('Add User')
.width('90%')
.height(40)
.onClick(() => this.addUser())
// 用户列表
List({ space: 10 }) {
ForEach(this.users, (user: User) => {
ListItem() {
Column() {
Text(`Name: ${user.name}`)
Text(`Age: ${user.age}`)
Text(`Email: ${user.email}`)
}
.width('100%')
.padding(10)
}
}, (user: User) => user.id.toString())
}
.width('100%')
.layoutWeight(1)
}
.width('100%')
.height('100%')
.padding(10)
}
}
interface User {
id: number
name: string
age: number
email: string
}
四、最佳实践与注意事项
-
权限控制:在配置文件中声明所需权限
"requestPermissions": [ { "name": "ohos.permission.READ_USER_STORAGE", "reason": "Access user data" }, { "name": "ohos.permission.WRITE_USER_STORAGE", "reason": "Modify user data" } ]
-
性能优化:
- 批量操作代替单条操作
- 使用事务处理多个相关操作
- 合理使用索引提高查询效率
-
错误处理:
- 捕获并处理所有可能的数据操作异常
- 提供有意义的错误信息给用户
-
数据安全:
- 敏感数据应该加密存储
- 实现数据验证逻辑
- 遵循最小权限原则
通过本文介绍,开发者可以掌握HarmonyOS 5中DataAbility的核心概念和开发方法,实现安全高效的数据共享与管理功能。
更多推荐
所有评论(0)