首先介绍几个基本概念和方法!
关系型数据库
基于关系模型来管理数据的数据库,以行和列的形式存储数据。(可以简单理解成一个excel表格的形式)
谓词
数据库中用来代表数据实体的性质、特征或者数据实体之间关系的词项,主要用来定义数据库的操作条件。
(谓词:属于函数的一种,但其返回值是真值(true/false/unknown))
结果集
指用户查询之后的结果集合,有多种方法可以对数据进行访问。
SQLite数据库
它是一个开源的轻型的数据库。
场景介绍
关系型数据库是在SQLite基础上实现的本地数据操作机制,提供给用户无需编写原生SQL语句就能进行数据增删改查的方法,同时也支持原生SQL语句操作。
再看几个Data中相关生命周期功能介绍
运作机制
从下图可以知
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, introduc
tion 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)
}
};