0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenHarmony關(guān)系型數(shù)據(jù)庫概述

ITMING ? 來源:ITMING ? 作者:ITMING ? 2023-03-28 18:08 ? 次閱讀

1 概述

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

2 運作機制

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

3 使用場景

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

4 流程

5 詳細步驟

RDB對開發(fā)者提供的接口大部分為異步接口,均有callbackPromise兩種返回形式,接下來將會一一介紹。

5.1 導(dǎo)入模塊

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

5.2 配置數(shù)據(jù)庫相關(guān)信息

創(chuàng)建數(shù)據(jù)庫時需要配置數(shù)據(jù)庫相關(guān)信息,RDB提供管理關(guān)系型數(shù)據(jù)庫配置的StoreConfig接口,其參數(shù)如表5-1所示:

表5-1 關(guān)系型數(shù)據(jù)庫配置參數(shù)

名稱 類型 必填 說明
name string 數(shù)據(jù)庫文件名
securityLevel SecurityLevel(詳見表5-2) 設(shè)置數(shù)據(jù)庫安全級別
encrypt boolean 指定數(shù)據(jù)庫是否加密。true:加密。false:非加密。

表5-2 數(shù)據(jù)庫的安全級別枚舉

名稱 說明
S1 1 數(shù)據(jù)庫安全級別為低級別,當(dāng)數(shù)據(jù)泄露時會產(chǎn)生較低影響。如包含壁紙等系統(tǒng)數(shù)據(jù)的數(shù)據(jù)庫。
S2 2 數(shù)據(jù)庫安全級別為中級別,當(dāng)數(shù)據(jù)泄露時會產(chǎn)生較大影響。如包含錄音、視頻等用戶生成數(shù)據(jù)或通話記錄等信息的數(shù)據(jù)庫。
S3 3 數(shù)據(jù)庫安全級別為高級別,當(dāng)數(shù)據(jù)泄露時會產(chǎn)生重大影響。如包含用戶運動、健康、位置等信息的數(shù)據(jù)庫。
S4 4 數(shù)據(jù)庫安全級別為關(guān)鍵級別,當(dāng)數(shù)據(jù)泄露時會產(chǎn)生嚴(yán)重影響。如包含認(rèn)證憑據(jù)、財務(wù)數(shù)據(jù)等信息的數(shù)據(jù)庫。
const store_config = {
    name: "RdbSample.db",
    securityLevel: relationalStore.SecurityLevel.S4,
    encrypt: true
}

5.3 創(chuàng)建數(shù)據(jù)庫

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

表5-3 數(shù)據(jù)庫創(chuàng)建方法

方法名 描述
getRdbStore(context: Context, config: StoreConfig, callback: AsyncCallback): void 獲得一個相關(guān)的RdbStore,操作關(guān)系型數(shù)據(jù)庫。context: 應(yīng)用上下文config: 數(shù)據(jù)庫配置信息callback: 回調(diào)函數(shù),返回RdbStore對象
getRdbStore(context: Context, config: StoreConfig): Promise 獲得一個相關(guān)的RdbStore,操作關(guān)系型數(shù)據(jù)庫。context: 應(yīng)用上下文config: 數(shù)據(jù)庫配置信息Promise: 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相關(guān)操作
  Log.info(TAG, "Get RdbStore successfully.");
})

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

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

5.4 數(shù)據(jù)表操作

創(chuàng)建數(shù)據(jù)庫后,獲取到RdbStore實例。RdbStore提供管理RDB方法的接口,在使用其增、刪、改、查等接口之前,需要使用executeSql接口初始化數(shù)據(jù)表結(jié)構(gòu)和相關(guān)數(shù)據(jù)。

5.4.1 創(chuàng)建數(shù)據(jù)表

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

表5-4 創(chuàng)建數(shù)據(jù)表方法

方法名 描述
executeSql(sql: string,bindArgs: Array, callback: AsyncCallback): void 執(zhí)行包含指定參數(shù)但不返回值得SQL語句。sql: 指定要執(zhí)行得SQL語句bindArgs: SQL語句中參數(shù)的值callback: 回調(diào)函數(shù)
executeSql(sql: string,bindArgs: Array): Promise 執(zhí)行包含指定參數(shù)但不返回值得SQL語句。sql: 指定要執(zhí)行得SQL語句bindArgs: SQL語句中參數(shù)的值Promise: 無返回結(jié)果的Promise對象

注:表中的ValueType用于表示允許的數(shù)據(jù)字段類型,當(dāng)前僅支持表示值類型為數(shù)字的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));
})

5.4.2 新增數(shù)據(jù)

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

表5-5 新增數(shù)據(jù)方法

方法名 描述
insert(table: string, values: ValuesBucket, callback: AsyncCallback):void 向表中插入一行數(shù)據(jù)。table: 插入數(shù)據(jù)的目標(biāo)表名稱values: 插入到表中的數(shù)據(jù)行callback: 回調(diào)函數(shù)。插入成功,返回行ID,否則返回-1
insert(table: string, values: ValuesBucket): Promise 向表中插入一行數(shù)據(jù)。table: 插入數(shù)據(jù)的目標(biāo)表名稱values: 插入到表中的數(shù)據(jù)行Promise: Promise對象。插入成功,返回行ID,否則返回-1
batchInsert(table: string, values: Array, callback: AsyncCallback):void 向表中插入一組數(shù)據(jù)table: 插入數(shù)據(jù)的目標(biāo)表名稱插入到表中的一組數(shù)據(jù)callback: 回調(diào)函數(shù)。插入成功,返回插入的數(shù)據(jù)個數(shù),否則返回-1
batchInsert(table: string, values: Array):Promise 向表中插入一組數(shù)據(jù)table: 插入數(shù)據(jù)的目標(biāo)表名稱插入到表中的一組數(shù)據(jù)Promise: Promise對象。插入成功,返回插入的數(shù)據(jù)個數(shù),否則返回-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));
})

5.4.3 更新數(shù)據(jù)

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

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

表5-6 更新數(shù)據(jù)方法

方法名 描述
update(values: ValuesBucket, predicates: RdbPredicates, callback: AsyncCallback):void 根據(jù)RdbPredicates的指定實例對象更新數(shù)據(jù)庫中的數(shù)據(jù)。values: 數(shù)據(jù)表中要更新的數(shù)據(jù)行predicates: RdbPredicates的實例對象指定的更新條件callback: 回調(diào)函數(shù),返回受影響的行數(shù)
update(values: ValuesBucket, predicates: RdbPredicates):Promise 根據(jù)RdbPredicates的指定實例對象更新數(shù)據(jù)庫中的數(shù)據(jù)。values: 數(shù)據(jù)表中要更新的數(shù)據(jù)行predicates: RdbPredicates的實例對象指定的更新條件Promise: Promise對象,返回受影響的行數(shù)
update(table: string, values: ValuesBucket, predicates: dataSharePredicates.DataSharePredicates, callback: AsyncCallback): void 根據(jù)DataSharePredicates的指定實例對象更新數(shù)據(jù)表的數(shù)據(jù)。table: 更新數(shù)據(jù)表的名稱values: 數(shù)據(jù)表中要更新的數(shù)據(jù)行predicates: DataSharePredicates的實例對象指定的更新條件callback: 回調(diào)函數(shù),返回受影響的行數(shù)
update(table: string, values: ValuesBucket, predicates: dataSharePredicates.DataSharePredicates): Promise 根據(jù)DataSharePredicates的指定實例對象更新數(shù)據(jù)表的數(shù)據(jù)。table: 更新數(shù)據(jù)表的名稱values: 數(shù)據(jù)表中要更新的數(shù)據(jù)行predicates: DataSharePredicates的實例對象指定的更新條件Promise: Promise對象,返回受影響的行數(shù)
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));
})

5.4.4 查詢數(shù)據(jù)

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

表5-7 查詢數(shù)據(jù)方法

方法名 描述
query(predicates: RdbPredicates, columns: Array, callback: AsyncCallback): void 根據(jù)RdbPredicates的指定實例對象條件查詢數(shù)據(jù)表中的數(shù)據(jù)。predicates: RdbPredicates的實例對象指定的查詢條件columns: 查詢的列名稱,為空則表示查詢所有列callback: 回調(diào)函數(shù),操作成功,返回ResultSet對象
query(predicates: RdbPredicates, columns: Array): Promise 根據(jù)RdbPredicates的指定實例對象條件查詢數(shù)據(jù)表中的數(shù)據(jù)。predicates: RdbPredicates的實例對象指定的查詢條件columns: 查詢的列名稱,為空則表示查詢所有列Promise: Promise對象,操作成功,返回ResultSet對象
query(table: string, predicates: dataSharePredicates.DataSharePredicates, columns: Array, callback: AsyncCallback): void 根據(jù)DataSharePredicates的指定實例對象條件查詢數(shù)據(jù)表中的數(shù)據(jù)。table: 查詢數(shù)據(jù)表名稱predicates: DataSharePredicates的實例對象指定的查詢條件columns: 查詢的列名稱,為空則表示查詢所有列callback: 回調(diào)函數(shù),操作成功,返回ResultSet對象
query(table: string, predicates: dataSharePredicates.DataSharePredicates, columns: Array): Promise 根據(jù)DataSharePredicates的指定實例對象條件查詢數(shù)據(jù)表中的數(shù)據(jù)。table: 查詢數(shù)據(jù)表名稱predicates: DataSharePredicates的實例對象指定的查詢條件columns: 查詢的列名稱,為空則表示查詢所有列Promise: 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.4.5 刪除數(shù)據(jù)

表5-8 刪除數(shù)據(jù)方法

方法名 描述
delete(predicates: RdbPredicates, callback: AsyncCallback):void 根據(jù)RdbPredicates指定實例對象從數(shù)據(jù)表中刪除數(shù)據(jù)predicates: RdbPredicates實例對象指定的刪除條件callback: 回調(diào)函數(shù),返回受影響的行數(shù)
delete(predicates: RdbPredicates):Promise 根據(jù)RdbPredicates指定實例對象從數(shù)據(jù)表中刪除數(shù)據(jù)predicates: RdbPredicates實例對象指定的刪除條件Promise: Promise對象,返回受影響的行數(shù)
delete(table: string, predicates: dataSharePredicates.DataSharePredicates, callback: AsyncCallback):void 根據(jù)DataSharePredicates指定實例對象從數(shù)據(jù)表中刪除數(shù)據(jù)table: 刪除數(shù)據(jù)的數(shù)據(jù)表名稱predicates: DataSharePredicates實例對象指定的刪除條件callback: 回調(diào)函數(shù),返回受影響的行數(shù)
delete(table: string, predicates: dataSharePredicates.DataSharePredicates):Promise 根據(jù)DataSharePredicates指定實例對象從數(shù)據(jù)表中刪除數(shù)據(jù)table: 刪除數(shù)據(jù)的數(shù)據(jù)表名稱predicates: DataSharePredicates實例對象指定的刪除條件Promise: 回調(diào)函數(shù),返回受影響的行數(shù)
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操作數(shù)據(jù)表

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

  • querySql()方法支持使用指定SQL語句查詢數(shù)據(jù)表中的數(shù)據(jù)
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 小節(jié)

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
收藏 人收藏

    評論

    相關(guān)推薦

    OpenHarmony關(guān)系數(shù)據(jù)庫查詢結(jié)果呈現(xiàn)

    `ResultSet`(結(jié)果集)是OpenHarmony關(guān)系數(shù)據(jù)庫提供查詢數(shù)據(jù)表返回結(jié)果的方法,提供了多種靈活的
    的頭像 發(fā)表于 03-28 18:06 ?1360次閱讀
    <b class='flag-5'>OpenHarmony</b><b class='flag-5'>關(guān)系</b><b class='flag-5'>型</b><b class='flag-5'>數(shù)據(jù)庫</b>查詢結(jié)果呈現(xiàn)

    HarmonyOS開發(fā)案例:【關(guān)系數(shù)據(jù)庫

    使用關(guān)系數(shù)據(jù)庫的相關(guān)接口實現(xiàn)了對賬單的增、刪、改、查操作。
    的頭像 發(fā)表于 04-22 14:58 ?556次閱讀
    HarmonyOS開發(fā)案例:【<b class='flag-5'>關(guān)系</b><b class='flag-5'>型</b><b class='flag-5'>數(shù)據(jù)庫</b>】

    HarmonyOS開發(fā)案例:【搭建關(guān)系數(shù)據(jù)庫】(4)

    本節(jié)將介紹如何調(diào)用關(guān)系數(shù)據(jù)庫接口在本地搭建數(shù)據(jù)庫,并讀寫相應(yīng)的用戶數(shù)據(jù)。
    的頭像 發(fā)表于 05-11 10:27 ?651次閱讀
    HarmonyOS開發(fā)案例:【搭建<b class='flag-5'>關(guān)系</b><b class='flag-5'>型</b><b class='flag-5'>數(shù)據(jù)庫</b>】(4)

    關(guān)系數(shù)據(jù)庫與非關(guān)系數(shù)據(jù)庫的區(qū)別淺析

    關(guān)系數(shù)據(jù)庫的一個劣勢就是 阻抗失諧(impedance mismatch):關(guān)系模型和內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)之間存在差異
    發(fā)表于 06-03 06:03

    HarmonyOS關(guān)系數(shù)據(jù)庫和對象關(guān)系數(shù)據(jù)庫的使用方法

    容易就上手的知識。本篇速成教程直接使用最精準(zhǔn)和簡短的文字,再配上講解代碼,讓我們能在10分鐘左右就能掌握最基本的數(shù)據(jù)庫使用方法。數(shù)據(jù)庫的三大要素:數(shù)據(jù)庫、表、字段,接下來為大家介紹關(guān)系
    發(fā)表于 03-29 14:10

    什么是關(guān)系數(shù)據(jù)庫

    什么是關(guān)系數(shù)據(jù)庫 關(guān)系數(shù)據(jù)庫簡介   關(guān)系
    發(fā)表于 06-17 07:38 ?9094次閱讀

    什么是非關(guān)系數(shù)據(jù)庫

    什么是非關(guān)系數(shù)據(jù)庫 談到非關(guān)系數(shù)據(jù)庫設(shè)計的難點,朱海峰說:“我們可以從一些場景來看這個問題
    發(fā)表于 06-17 15:49 ?3103次閱讀

    關(guān)系數(shù)據(jù)庫是什么?

    關(guān)系數(shù)據(jù)庫是什么? 數(shù)字時代伊始,數(shù)據(jù)庫就一直是商業(yè)計算的核心組成部分。事實上,關(guān)系數(shù)據(jù)庫誕生于1970年。那一年,IBM的研究員E.F. Codd撰寫了一篇論文,概述了主
    發(fā)表于 07-31 12:26 ?2166次閱讀

    hbase和關(guān)系數(shù)據(jù)庫的區(qū)別

    hbase和關(guān)系數(shù)據(jù)庫的區(qū)別就是對于傳統(tǒng)數(shù)據(jù)庫,增加列對于一個項目來講,改變是非常大的。但是對于nosql,插入列和刪除列,跟傳統(tǒng)數(shù)據(jù)庫
    發(fā)表于 12-27 15:51 ?1.1w次閱讀
    hbase和<b class='flag-5'>關(guān)系</b><b class='flag-5'>型</b><b class='flag-5'>數(shù)據(jù)庫</b>的區(qū)別

    關(guān)系數(shù)據(jù)庫表結(jié)構(gòu)的設(shè)計有什么技巧?兩個設(shè)計技巧詳細說明

    關(guān)系數(shù)據(jù)庫表結(jié)構(gòu)的設(shè)計,有下面兩個設(shè)計技巧: 物理主鍵作為關(guān)聯(lián)的外鍵 關(guān)系數(shù)據(jù)庫,由多個
    發(fā)表于 10-16 10:33 ?13次下載

    數(shù)據(jù)庫學(xué)習(xí)入門資料之關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL的詳細資料概述

    本文檔的主要內(nèi)容詳細介紹的是數(shù)據(jù)庫學(xué)習(xí)入門資料之關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL的詳細資料概述主要內(nèi)容包括了:1 SQL概述2 數(shù)據(jù)定義3 查詢4
    發(fā)表于 10-25 16:29 ?20次下載

    數(shù)據(jù)庫教程之關(guān)系數(shù)據(jù)庫知識點總結(jié)的詳細資料概述

    本文檔的主要內(nèi)容詳細介紹的是數(shù)據(jù)庫教程之關(guān)系數(shù)據(jù)庫知識點總結(jié)的詳細資料概述主要內(nèi)容包括了:1 關(guān)系模型概述2
    發(fā)表于 11-28 19:44 ?4次下載
    <b class='flag-5'>數(shù)據(jù)庫</b>教程之<b class='flag-5'>關(guān)系數(shù)據(jù)庫</b>知識點總結(jié)的詳細資料<b class='flag-5'>概述</b>

    基于SQLite的鴻蒙的關(guān)系數(shù)據(jù)庫使用

    HarmonyOS關(guān)系數(shù)據(jù)庫基于SQLite組件提供了一套完整的對本地數(shù)據(jù)庫進行管理的機制,對外提供了一系列的增、刪、改、查接口,也可以直接運行用戶輸入的SQL語句來滿足復(fù)雜的場景需
    的頭像 發(fā)表于 01-20 11:48 ?3696次閱讀
    基于SQLite的鴻蒙的<b class='flag-5'>關(guān)系</b><b class='flag-5'>型</b><b class='flag-5'>數(shù)據(jù)庫</b>使用

    輕松設(shè)計關(guān)系數(shù)據(jù)庫教程

    本文討論關(guān)系數(shù)據(jù)庫設(shè)計相關(guān)的一些內(nèi)容,涉及關(guān)系模型,表結(jié)構(gòu)設(shè)計等內(nèi)容,以學(xué)生選修課程講述設(shè)計過程,在盡量講清楚設(shè)計要領(lǐng)的前提下,簡化設(shè)計內(nèi)容。 本文基于MySQL數(shù)據(jù)庫為基礎(chǔ),適合有一定關(guān)系
    的頭像 發(fā)表于 07-13 09:13 ?1575次閱讀

    關(guān)系數(shù)據(jù)庫的基本原理(什么是關(guān)系數(shù)據(jù)庫

    什么是關(guān)系數(shù)據(jù)庫?關(guān)系數(shù)據(jù)庫,簡稱 RDBMS是由許多數(shù)
    的頭像 發(fā)表于 07-10 09:06 ?1279次閱讀