一、DataAbility基本概念

在HarmonyOS 5中,DataAbility是一种特殊的能力,允许应用以统一的方式对外提供数据访问接口。它基于URI(统一资源标识符)机制,支持跨应用数据共享,同时保证数据安全。

DataAbility的核心特点包括:

  1. 标准化访问:通过URI标识数据资源
  2. 安全隔离:基于权限机制控制访问
  3. 多数据源支持:可封装数据库、文件等不同数据源
  4. 跨进程通信:支持应用间数据交互

二、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
}

四、最佳实践与注意事项

  1. 权限控制:在配置文件中声明所需权限

    "requestPermissions": [
      {
        "name": "ohos.permission.READ_USER_STORAGE",
        "reason": "Access user data"
      },
      {
        "name": "ohos.permission.WRITE_USER_STORAGE",
        "reason": "Modify user data"
      }
    ]
    
  2. 性能优化

    • 批量操作代替单条操作
    • 使用事务处理多个相关操作
    • 合理使用索引提高查询效率
  3. 错误处理

    • 捕获并处理所有可能的数据操作异常
    • 提供有意义的错误信息给用户
  4. 数据安全

    • 敏感数据应该加密存储
    • 实现数据验证逻辑
    • 遵循最小权限原则

通过本文介绍,开发者可以掌握HarmonyOS 5中DataAbility的核心概念和开发方法,实现安全高效的数据共享与管理功能。

Logo

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

更多推荐