立即注册
查看: 598|回复: 2

[鸿蒙OS技术分享] HarmonyOS Data Ability关系数据库使用方法介绍

已绑定手机
发表于 2022-4-16 10:00:01 | 显示全部楼层 |阅读模式 来自 广东省深圳市
基本概念和方法
①关系型数据库
基于关系模型来管理数据的数据库,以行和列的形式存储数据。(可以简单理解成一个 excel 表格的形式)
②谓词
数据库中用来代表数据实体的性质、特征或者数据实体之间关系的词项,主要用来定义数据库的操作条件。(谓词:属于函数的一种,但其返回值是真值(true/false/unknown))
③结果集
指用户查询之后的结果集合,有多种方法可以对数据进行访问。
④SQLite 数据库
它是一个开源的轻型的数据库。
⑤场景介绍
关系型数据库是在 SQLite 基础上实现的本地数据操作机制,提供给用户无需编写原生 SQL 语句就能进行数据增删改查的方法,同时也支持原生 SQL 语句操作。

Data中相关生命周期功能介绍
2.jpg
3.jpg
从上图可以知:Data 模板的 Ability 是基于 Rdb 封装的,Rdb 是基于 SQLite 数据库,一个开源的轻型的数据库,所以 Data_Ability 高效便捷的为我们提供了一套工具去管理其自身和其他应用存储数据的访问。

下面逐步分析基于 Rdb 创建的一个 Data_Ability 的数据操作过程:
//=====================导入模块部分=========================
// 导入DataAbility 谓词相关模块
import dataAbility from '@ohos.data.dataability'
//导入rdb关系数据库 模块
import dataRdb from '@ohos.data.rdb'
//=====================定义变量部分=========================
//定义数据库表名  book
const TABLE_NAME = 'book'
// 与此RDB存储相关的数据库配置。. encryptKey: 为数据库设置的加密密钥
const STORE_CONFIG = { name: 'book.db', encryptKey: new Uint8Array([]) }
//定义 SQL_CREATE_TABLE 关键字参数,下面执行参数会用到
const SQL_CREATE_TABLE = 'CREATE TABLE IF NOT EXISTS book(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, introduction TEXT NOT NULL)'
//定义一个变量 进行储存数据库返回内容,避免多次调用执行,节省性能
let rdbStore: any = undefined
//测试用打log用的
const TAG = 'DataAbility.data'
//=====================创建数据库=========================
export default {
// onInitialized 在Ability初始化调用,通过此回调方法执行rdb等初始化操作。
    onInitialized(abilityInfo) {
        console.info('DataAbility onInitialized,abilityInfo=' + abilityInfo.bundleName)
//getRdbStore() 获得一个相关的RdbStore,操作关系型数据库,用户可以根据自己的需求配置RdbStore的参数,然后通过RdbStore调用相关接口可以执行相关的数据操作,结果以callback形式返回。
        dataRdb.getRdbStore(STORE_CONFIG, 1, (err, store) => {
            console.info('[data]getRdbStoreThen')
//执行包含指定参数但不返回值的SQL语句,结果以Promise形式返回。
            store.executeSql(SQL_CREATE_TABLE, [])
//把获得的数据库存入本地变量,防止后面多次操作读取创建
            rdbStore = store
        });
    },
//=====================数据库操作方法=========================
//url:通信使用的URI
//callback:自定义回调函数名 如果操作成功,则返回ResultSet对象。
//valueBucket:指示数据库中要更新的数据行。键值对与数据库表的列名相关联
//TABLE_NAME:指定的目标表名。
//insert:向数据中插入一条数据。  callbacke方式调用:
    insert(uri, valueBucket, callback) {
        console.info(TAG + ' insert start')
        rdbStore.insert(TABLE_NAME, valueBucket, callback)
    },


//url:通信使用的URI
//valueBucket:指示数据库中要更新的数据行。键值对与数据库表的列名相关联
//callback:指定callback回调函数。如果操作成功,则返回ResultSet对象。
// batchInsert: 向数据库中插入多条数据。
    batchInsert(uri, valueBuckets, callback) {
        console.info(TAG + ' batch insert start')
//循环遍历
        for (let i = 0;i < valueBuckets.length; i++) {
            console.info(TAG + ' batch insert i=' + i)
            if (i < valueBuckets.length - 1) {
//最终还是用到的insert方法
                rdbStore.insert(TABLE_NAME, valueBuckets, (num: number) => {
                    console.info(TAG + ' batch insert ret=' + num)
                })
            } else {
                rdbStore.insert(TABLE_NAME, valueBuckets, callback)
            }
        }
    },
//url:通信使用的URI
//predicates:表示rdbPredicates的实例对象指定的查询条件。
//columns:表示要查询的列。如果值为空,则查询应用于所有列。
//callback:指定callback回调函数。如果操作成功,则返回ResultSet对象。
//query:查询数据库中的数据。
    query(uri, columns, predicates, callback) {
        console.info(TAG + ' query start')
        let rdbPredicates = dataAbility.createRdbPredicates(TABLE_NAME, predicates)
        rdbStore.query(rdbPredicates, columns, callback)
    },

//url:通信使用的URI
//valueBucket:指示数据库中要更新的数据行。键值对与数据库表的列名相关联
//predicates:表示要插入到表中的数据行。
//callback:指定callback回调函数。如果操作成功,则返回ResultSet对象。
// update:更新数据库中的数据。
    update(uri, valueBucket, predicates, callback) {
        console.info(TAG + 'update start')
        let rdbPredicates = dataAbility.createRdbPredicates(TABLE_NAME, predicates)
        rdbStore.update(valueBucket, rdbPredicates, callback)
    },
//url:通信使用的URI
//delete: 删除一条或多条数据。
//predicates:表示要删除表中的数据行。
//callback:指定callback回调函数。如果操作成功,则返回ResultSet对象。
    delete(uri, predicates, callback) {
        console.info(TAG + 'delete start')
        let rdbPredicates = dataAbility.createRdbPredicates(TABLE_NAME, predicates)
        rdbStore.delete(rdbPredicates, callback)
    }
};
已绑定手机
发表于 2022-4-19 07:12:13 | 显示全部楼层 来自 上海市
关系数据库使用方法介绍
已绑定手机
发表于 2022-4-29 09:45:51 | 显示全部楼层 来自 广东省
感谢分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

合作/建议

TEL: 19168984579

工作时间:
周一到周五 9:00-11:30 13:30-19:30
  • 扫一扫关注公众号
  • 扫一扫打开小程序
Copyright © 2013-2024 一牛网 版权所有 All Rights Reserved. 帮助中心|隐私声明|联系我们|手机版|粤ICP备13053961号|营业执照|EDI证
在本版发帖搜索
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表