成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

OpenHarmony關系型數據庫封裝前的知識要點

數據庫 其他數據庫
本節僅對RDB數據庫的簡單使用做了講解,其中涉及到RdbPredicates、DataSharePredicates、ResultSet相關的更多內容將在后續封裝RDB工具類中詳細介紹。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

1、概述

關系型數據庫(Relational Database, 以下簡稱RDB)是一種基于關系模型來管理數據的數據庫,是在SQLite基礎上提供一套完整的對本地數據庫進行管理的機制,為開發者提供無需編寫原生SQL語句即可實現數據增、刪、改、查等接口,同時開發者也可以直接運行原生SQL語句來滿足復雜的場景需要。關系型數據庫在應用卸載之后,才會被自動清除。

2、運作機制

RDB對外提供通用的接口,底層使用SQLite作為持久化存儲引擎,支持SQLite具有的所有數據庫特性。SQLite是一個進程內的庫,具有自給自足、無服務、零配置、事務性特性的SQL數據庫引擎。RDB包括但不限于事務、索引、視圖、觸發器、外鍵、參數化查詢和預編譯SQL語句。

#創作者激勵# OpenHarmony關系型數據庫封裝前的知識要點-開源基礎軟件社區

3、使用場景

  • 通訊錄
  • 記事本
  • 計算器歷史記錄
  • App用戶登錄信息
  • App主題

4、流程

#創作者激勵# OpenHarmony關系型數據庫封裝前的知識要點-開源基礎軟件社區

5、詳細步驟

RDB對開發者提供的接口大部分為異步接口,均有??callback??和??Promise??兩種返回形式,接下來將會一一介紹。

(1)導入模塊

import relationalStore from '@ohos.data.relationalStore';

(2)配置數據庫相關信息

創建數據庫時需要配置數據庫相關信息,RDB提供管理關系型數據庫配置的StoreConfig接口,其參數如表5-1所示:

表5-1 關系型數據庫配置參數.

名稱

類型

必填

說明

name

string

數據庫文件名

securityLevel

SecurityLevel(詳見表5-2)

設置數據庫安全級別

encrypt

boolean

指定數據庫是否加密。

true:加密。

false:非加密。

表5-2 數據庫的安全級別枚舉。

名稱

說明

S1

1

數據庫安全級別為低級別,當數據泄露時會產生較低影響。如包含壁紙等系統數據的數據庫。

S2

2

數據庫安全級別為中級別,當數據泄露時會產生較大影響。如包含錄音、視頻等用戶生成數據或通話記錄等信息的數據庫。

S3

3

數據庫安全級別為高級別,當數據泄露時會產生重大影響。如包含用戶運動、健康、位置等信息的數據庫。

S4

4

數據庫安全級別為關鍵級別,當數據泄露時會產生嚴重影響。如包含認證憑據、財務數據等信息的數據庫。

const store_config = {
name: "RdbSample.db",
securityLevel: relationalStore.SecurityLevel.S4,
encrypt: true
}

(3)創建數據庫

和MySQL、Oracle等數據庫類似,在使用之前需要先創建數據庫,RDB提供了getRdbStore()方法用于創建數據庫,該方法需要傳入應用上下文Context和數據庫配置信息StoreConfig兩個參數,該方法有callback和Promise兩種返回形式,如表5-3所示。表5-3 數據庫創建方法。

方法名

描述

getRdbStore(context: Context, config: StoreConfig, callback: AsyncCallback<RdbStore>): void

獲得一個相關的RdbStore,操作關系型數據庫。

context: 應用上下文

config: 數據庫配置信息

callback: 回調函數,返回RdbStore對象

getRdbStore(context: Context, config: StoreConfig): Promise<RdbStore>

獲得一個相關的RdbStore,操作關系型數據庫。

context: 應用上下文

config: 數據庫配置信息

Promise<RdbStore>: Promise對象,返回RdbStore對象

// callback形式
relationalStore.getRdbStore(this.context, STORE_CONFIG, (err, rdbStore) => {
if (err) {
Log.error(TAG, "Get RdbStore fialed, err: " + JSON.stringify(err))
return;
}
// rdbStore相關操作
Log.info(TAG, "Get RdbStore successfully.");
})

// Promise形式
relationalStore.getRdbStore(this.context, STORE_CONFIG).then((rdbStore) => {
// rdbStore相關操作
Log.info(TAG, "Get RdbStore successfully.");
}).catch((err) => {
Log.error(TAG, "Get RdbStore fialed, err: " + JSON.stringify(err))
})

注:RDB不僅提供了數據庫創建的方法,同時還提供了刪除數據庫方法,可以調用deleteRdbStore()方法進行數據庫刪除,使用方式和getRdbStore()方法類似。

(4)數據表操作

創建數據庫后,獲取到RdbStore實例。RdbStore提供管理RDB方法的接口,在使用其增、刪、改、查等接口之前,需要使用executeSql接口初始化數據表結構和相關數據。

創建數據表

executeSql()方法執行包含指定參數但不返回值得SQL語句,有callback和Promise兩種形式,如表5-4所示。

表5-4 創建數據表方法:

方法名

描述

executeSql(sql: string,bindArgs: Array<ValueType>, callback: AsyncCallback<void>): void

執行包含指定參數但不返回值得SQL語句。

sql: 指定要執行得SQL語句

bindArgs: SQL語句中參數的值

callback: 回調函數

executeSql(sql: string,bindArgs: Array<ValueType>): Promise<void>

執行包含指定參數但不返回值得SQL語句。

sql: 指定要執行得SQL語句

bindArgs: SQL語句中參數的值

Promise<void>: 無返回結果的Promise對象

注:表中的ValueType用于表示允許的數據字段類型,當前僅支持表示值類型為數字的number,表示值類型為字符的string,表示值類型為布爾值的boolean。

const sql = "CREATE TABLE IF NOT EXISTS USER (ID INTEGER PRIMARY KEY AUTOINCREMENT, USERNAME TEXT NOT NULL, PASSWORD TEXT NOT NULL)"
// callback形式
rdbStore.executeSql(sql, null, (err) {
if (err) {
Log.error(TAG, "ExecuteSql failed, err: " + JSON.stringify(err));
return;
}
Log.info(TAG, "Create table done.");
})
// Promise形式
rdbStore.executeSql(sql, null).then(() => {
Log.info(TAG, "Create table done.");
}).catch((err) => {
Log.error(TAG, "ExecuteSql failed, err: " + JSON.stringify(err));
})

新增數據

RdbStore提供了單條數據插入和批量數據插入兩種為數據表新增數據的方法,如表5-5所示。

表5-5 新增數據方法:

方法名

描述

insert(table: string, values: ValuesBucket, callback: AsyncCallback<number>):void

向表中插入一行數據。

table: 插入數據的目標表名稱

values: 插入到表中的數據行

callback: 回調函數。插入成功,返回行ID,否則返回-1

insert(table: string, values: ValuesBucket): Promise<number>

向表中插入一行數據。

table: 插入數據的目標表名稱

values: 插入到表中的數據行

Promise<number>: Promise對象。插入成功,返回行ID,否則返回-1

batchInsert(table: string, values: Array<ValuesBucket>, callback: AsyncCallback<number>):void

向表中插入一組數據

table: 插入數據的目標表名稱

插入到表中的一組數據

callback: 回調函數。插入成功,返回插入的數據個數,否則返回-1

batchInsert(table: string, values: Array<ValuesBucket>):Promise<number>

向表中插入一組數據

table: 插入數據的目標表名稱

插入到表中的一組數據

Promise<number>: Promise對象。插入成功,返回插入的數據個數,否則返回-1

注:表5-5中ValuesBucket是用于存儲鍵值對的類型,其鍵為string類型,值類型可為ValueType|Uint8Array|null。

const tableName = "USER";
const valueBacket = {
"USERNAME": "Admin",
"PASSWORD": "123456"
}
// insert callback形式
rdbStore.insert(tableName, valueBucket, (err, rowId) => {
if (err) {
Log.error(TAG, "Insert data failed, err: " + JSON.stringify(err));
return;
}
Log.info(TAG, "Insert data successful, rowId = " + rowId);
})
// insert Promise形式
rdbStore.insert(tableName, valueBucket).then((rowId) => {
Log.info(TAG, "Insert data successful, rowId = " + rowId);
}).catch((err) => {
Log.error(TAG, "Insert data failed, err: " + JSON.stringify(err));
})

const valueBuckets = [{
"USERNAME": "aaa",
"PASSWORD": "123456"
}, {
"USERNAME": "bbb",
"PASSWORD": "123456"
}]
// batchInsert callback形式
rdbStore.batchInsert(tableName, valueBuckets, (err, count) => {
if (err) {
Log.error(TAG, "batchInsert data failed, err: " + JSON.stringify(err));
return;
}
Log.info(TAG, "batchInsert data successful, count = " + count);
})
// batchInsert Promise形式
rdbStore.batchInsert(tableName, valueBuckets).then((count) => {
Log.info(TAG, "batchInsert data successful, count = " + count);
}).catch((err) => {
Log.error(TAG, "batchInsert data failed, err: " + JSON.stringify(err));
})

更新數據

RdbStore提供了根據RdbPredicates指定實例對象和根據DataSharePredicates指定實例對象兩種方式更新數據表中的數據,兩種方式均有callback和Promise形式,如表5-6所示。

RdbPredicates和DataSharePredicates均用于數據表中用來代表數據實體的性質、特征或者數據實體之間關系的詞項,主要用于定義數據表的操作條件。如設置根據賬號查找用戶信息的條件,或者根據賬號修改用戶密碼的條件。兩者區別在于使用前者需要先指定操作的數據表名稱,同時前者為分布式數據操作做了擴充。使用后者需要導入新模塊import dataSharePredicates from '@ohos.data.dataSharePredicates'。

表5-6 更新數據方法:

方法名

描述

update(values: ValuesBucket, predicates: RdbPredicates, callback: AsyncCallback<number>):void

根據RdbPredicates的指定實例對象更新數據庫中的數據。

values: 數據表中要更新的數據行

predicates: RdbPredicates的實例對象指定的更新條件

callback: 回調函數,返回受影響的行數

update(values: ValuesBucket, predicates: RdbPredicates):Promise<number>

根據RdbPredicates的指定實例對象更新數據庫中的數據。

values: 數據表中要更新的數據行

predicates: RdbPredicates的實例對象指定的更新條件

Promise<number>: Promise對象,返回受影響的行數

update(table: string, values: ValuesBucket, predicates: dataSharePredicates.DataSharePredicates, callback: AsyncCallback<number>): void

根據DataSharePredicates的指定實例對象更新數據表的數據。

table: 更新數據表的名稱

values: 數據表中要更新的數據行

predicates: DataSharePredicates的實例對象指定的更新條件

callback: 回調函數,返回受影響的行數

update(table: string, values: ValuesBucket, predicates: dataSharePredicates.DataSharePredicates): Promise<number>

根據DataSharePredicates的指定實例對象更新數據表的數據。

table: 更新數據表的名稱

values: 數據表中要更新的數據行

predicates: DataSharePredicates的實例對象指定的更新條件

Promise<number>: Promise對象,返回受影響的行數

const tableName = "USER";
const valueBucket = {
"USERNAME": "aaa",
"PASSWORD": "123456789"
}

// RdbPredicates
let predicates = new relationalStore.RdbPredicates(tableName);
predicates.equalTo("USERNAME", "aaa");
// update callback形式
rdbStore.update(valueBucket, predicates, (err, rows) => {
if (err) {
Log.error(TAG, "Updated failed, err: " + JSON.stringify(err));
return;
}
Log.info(TAG, "Updated row count: " + rows);
})
// update Promise形式
rdbStore.update(valueBucket, predicates).then((rows) => {
Log.info(TAG, "Updated row count: " + rows);
}).catch((err) => {
Log.error(TAG, "Updated failed, err: " + JSON.stringify(err));
})

// DataSharePredicates
let predicates = new dataSharePredicates.DataSharePredicates();
predicates.equalTo("USERNAME", "aaa");
// update callback形式
rdbStore.update(tableName, valueBucket, predicates, (err, rows) => {
if (err) {
Log.error(TAG, "Updated failed, err: " + JSON.stringify(err));
return;
}
Log.info(TAG, "Updated row count: " + rows);
})
// update Promise形式
rdbStore.update(tableName, valueBucket, predicates).then((rows) => {
Log.info(TAG, "Updated row count: " + rows);
}).catch((err) => {
Log.error(TAG, "Updated failed, err: " + JSON.stringify(err));
})

查詢數據

數據表數據的查詢和更新相似,RdbStore也提供了RdbPredicates和DataSharePredicates兩種方式,如表5-7所示。不同之處在于返回的結果不同,更新數據返回受影響的行數,查詢數據返回的數據結果集ResultSet,關于結果集詳細講解將在下一節介紹。

表5-7 查詢數據方法:

方法名

描述

query(predicates: RdbPredicates, columns: Array<string>, callback: AsyncCallback<ResultSet>): void

根據RdbPredicates的指定實例對象條件查詢數據表中的數據。

predicates: RdbPredicates的實例對象指定的查詢條件

columns: 查詢的列名稱,為空則表示查詢所有列

callback: 回調函數,操作成功,返回ResultSet對象

query(predicates: RdbPredicates, columns: Array<string>): Promise<ResultSet>

根據RdbPredicates的指定實例對象條件查詢數據表中的數據。

predicates: RdbPredicates的實例對象指定的查詢條件

columns: 查詢的列名稱,為空則表示查詢所有列

Promise<ResultSet>: Promise對象,操作成功,返回ResultSet對象

query(table: string, predicates: dataSharePredicates.DataSharePredicates, columns: Array<string>, callback: AsyncCallback<ResultSet>): void

根據DataSharePredicates的指定實例對象條件查詢數據表中的數據。

table: 查詢數據表名稱

predicates: DataSharePredicates的實例對象指定的查詢條件

columns: 查詢的列名稱,為空則表示查詢所有列

callback: 回調函數,操作成功,返回ResultSet對象

query(table: string, predicates: dataSharePredicates.DataSharePredicates, columns: Array<string>): Promise<ResultSet>

根據DataSharePredicates的指定實例對象條件查詢數據表中的數據。

table: 查詢數據表名稱

predicates: DataSharePredicates的實例對象指定的查詢條件

columns: 查詢的列名稱,為空則表示查詢所有列

Promise<ResultSet>: Promise對象,操作成功,返回ResultSet對象

const tableName = "USER";
// RdbPredicates
let predicates = new relationalStore.RdbPredicates(tableName);
predicates.equalTo("USERNAME", "aaa");
// query callback形式
rdbStore.query(predicates, null, (err, resultSet) => {
if (err) {
Log.error(TAG, "Query failed, err: " + JSON.stringify(err));
return;
}
Log.info(TAG, "Query successful.");
Log.info(TAG, "ResultSet column count: " + resultSet.columnCount);
})
// query Promise形式
rdbStore.query(predicates, null).then((resultSet) => {
Log.info(TAG, "Query successful.");
Log.info(TAG, "ResultSet column count: " + resultSet.columnCoun
}).catch((err) => {
Log.error(TAG, "Query failed, err: " + JSON.stringify(err));
})

// DataSharePredicates
let predicates = new dataSharePredicates.DataSharePredicates();
predicates.equalTo("USERNAME", "aaa");
// query callback形式
rdbStore.query(tableName, predicates, null, (err, resultSet) => {
if (err) {
Log.error(TAG, "Query failed, err: " + JSON.stringify(err));
return;
}
Log.info(TAG, "Query successful.");
Log.info(TAG, "ResultSet column count: " + resultSet.columnCount);
})
// query Promise形式
rdbStore.query(tableName, predicates, null).then((resultSet) => {
Log.info(TAG, "Query successful.");
Log.info(TAG, "ResultSet column count: " + resultSet.columnCount);
}).catch((err) => {
Log.error(TAG, "Query failed, err: " + JSON.stringify(err));
})

刪除數據

表5-8 刪除數據方法:

方法名

描述

delete(predicates: RdbPredicates, callback: AsyncCallback<number>):void

根據RdbPredicates指定實例對象從數據表中刪除數據

predicates: RdbPredicates實例對象指定的刪除條件

callback: 回調函數,返回受影響的行數

delete(predicates: RdbPredicates):Promise<number>

根據RdbPredicates指定實例對象從數據表中刪除數據

predicates: RdbPredicates實例對象指定的刪除條件

Promise<number>: Promise對象,返回受影響的行數

delete(table: string, predicates: dataSharePredicates.DataSharePredicates, callback: AsyncCallback<number>):void

根據DataSharePredicates指定實例對象從數據表中刪除數據

table: 刪除數據的數據表名稱

predicates: DataSharePredicates實例對象指定的刪除條件

callback: 回調函數,返回受影響的行數

delete(table: string, predicates: dataSharePredicates.DataSharePredicates):Promise<number>

根據DataSharePredicates指定實例對象從數據表中刪除數據

table: 刪除數據的數據表名稱

predicates: DataSharePredicates實例對象指定的刪除條件

Promise<number>: 回調函數,返回受影響的行數

const tableName = "USER";
// RdbPredicates
let predicates = new relationalStore.RdbPredicates(tableName);
predicates.equalTo("USERNAME", "aaa");
// delete callback
rdbStore.delete(predicates, (err, rows) => {
if (err) {
Log.error(TAG, "Delete failed, err: " + JSON.string(err));
return;
}
Log.info(TAG, "Delete rows: " + rows);
})
// delete Promise
rdbStore.delete(predicates).then((rows) => {
Log.info(TAG, "Delete rows: " + rows);
}).catch((err) => {
Log.error(TAG, "Delete failed, err: " + JSON.string(err));
})

// DataSharePredicates
let predicates = new dataSharePredicates.DataSharePredicates();
predicates.equalTo("USERNAME", "aaa");
// delete callback
rdbStore.delete(tableName, predicates, (err, rows) => {
if (err) {
Log.error(TAG, "Delete failed, err: " + JSON.string(err));
return;
}
Log.info(TAG, "Delete rows: " + rows);
})
// delete Promise
rdbStore.delete(tableName, predicates).then((rows) => {
Log.info(TAG, "Delete rows: " + rows);
}).catch((err) => {
Log.error(TAG, "Delete failed, err: " + JSON.string(err));
})

6、原生SQL操作數據表

RdbStore不僅提供了適用于增刪改查簡單易操作的接口方法,同時還支持原生SQL語句的操作。

  • querySql()方法支持使用指定SQL語句查詢數據表中的數據。
const sql = "select * from user";
rdbStore.querySql(sql).then((resultSet) => {
Log.info(TAG, "Query successful.");
Log.info(TAG, "ResultSet column count: " + resultSet.columnCount);
}).catch((err) => {
Log.error(TAG, "Query failed, err: " + JSON.stringify(err));
})

7、小節

當然RdbStore還提供了其他的方法,諸如在開始執行SQL語句之前開啟事務的beginTransaction()方法、提交已執行的SQL語句的commit()方法、回滾已執行的SQL語句的rollBack()方法以及用于其他能力的方法。本節僅對RDB數據庫的簡單使用做了講解,其中涉及到RdbPredicates、DataSharePredicates、ResultSet相關的更多內容將在后續封裝RDB工具類中詳細介紹。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區
相關推薦

2018-07-18 09:16:39

關系型非關系型數據庫

2021-09-06 10:24:12

鴻蒙HarmonyOS應用

2016-08-23 14:25:19

MySQL約束數據庫

2017-03-17 14:44:04

關系型數據庫原理

2010-12-10 10:17:21

關系型數據庫

2022-06-13 08:30:01

數據庫管理系統

2018-03-26 12:58:52

數據庫OracleMySQL

2011-06-07 17:14:15

關系型數據庫壓縮技術

2013-04-26 16:18:29

大數據全球技術峰會

2021-01-26 13:31:48

數據庫關系型數據庫冗余

2023-05-20 08:11:55

2023-05-22 16:10:51

動態共享包數據庫

2022-12-27 08:38:45

關系型數據庫設計

2022-07-27 08:32:01

數據庫MySQL

2021-07-28 14:40:57

鴻蒙HarmonyOS應用

2019-05-05 16:13:07

關系型數據庫OracleMySQL

2015-04-24 13:59:41

2009-03-26 09:58:55

云計算關系型數據庫關系數據庫

2011-05-19 09:24:12

關系型數據庫

2013-06-28 11:28:21

Facebook數據庫大數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品色一区二区三区 | 亚洲网址在线观看 | 久久青草av | 成人网视频 | 久久久久国产精品 | 韩国av一区二区 | 欧美黄色性生活视频 | 最近中文字幕免费 | 美女张开腿露出尿口 | 在线播放91 | 欧美一区二区三区 | 国产乱码精品1区2区3区 | 美女国内精品自产拍在线播放 | 毛片一区二区 | 欧美日韩三级视频 | 国产不卡视频 | 伊人久久国产 | 男人影音 | 五月婷婷婷 | 日韩精品免费在线观看 | 亚洲高清在线 | 91社区在线高清 | 亚洲欧美成人影院 | 久久国产激情视频 | 国产精品视频一区二区三区不卡 | 日本五月婷婷 | 日韩av成人 | 国产三级一区二区 | 久久久久久国产精品三区 | 国产三级在线观看播放 | 日韩精品av一区二区三区 | 欧美簧片 | 不卡一区二区三区四区 | 欧美一区永久视频免费观看 | 成人精品一区 | 国产精品精品 | 亚洲精品区 | 成人激情视频在线观看 | 最新中文字幕第一页视频 | 国产三级一区二区 | 成人精品一区二区 |