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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鴻蒙的數據庫知識點學習

OpenHarmony技術社區(qū) ? 來源:鴻蒙技術社區(qū) ? 作者:中軟國際 ? 2021-09-06 09:34 ? 次閱讀

移動端開發(fā),數據存儲是非常重要的,鴻蒙也不例外,說到數據存儲,首要的就是數據庫了,數據庫的存儲機制是否完善,提供的功能是否簡單方便,直接影響開發(fā)者的開發(fā)速度和性能。

作為鴻蒙開發(fā)者,最近就深入學習了鴻蒙的數據庫知識點,了解了存儲機制并且嘗試了使用,發(fā)現(xiàn)鴻蒙的數據庫真的做到了應有盡有,操作還簡單的地步。

鴻蒙關系型數據庫

先來看看鴻蒙的關系型數據庫(Relational Database,RDB)概念。

鴻蒙的 RDB 是一種基于關系模型來管理數據的數據庫。HarmonyOS 關系型數據庫基于 SQLite 組件提供了一套完整的對本地數據庫進行管理的機制,對外提供了一系列的增、刪、改、查接口,也可以直接運行用戶輸入的 SQL 語句來滿足復雜的場景需要。

HarmonyOS 提供的關系型數據庫功能更加完善,查詢效率更高。

概念中一句話很重要,HarmonyOS 提供的關系型數據庫功能更加完善,查詢效率更高。

看到這里我當時是非常激動的,作為開發(fā)者難道不是最希望使用的 API 在什么情況下都適用嗎?

下面看看鴻蒙數據庫的運作機制,了解機制才能了解數據庫開發(fā)的核心,也有利于擴展。

運作機制

HarmonyOS 關系型數據庫對外提供通用的操作接口,底層使用 SQLite 作為持久化存儲引擎,支持 SQLite 具有的所有數據庫特性,包括但不限于事務、索引、視圖、觸發(fā)器、外鍵、參數化查詢和預編譯 SQL 語句。

看到上面的鴻蒙數據庫的運行機制不難發(fā)現(xiàn),主要工作還是在 framework 層做的封裝,然后調用 JNI,使用的還是 SQLite 組件。

不管底層怎么做的開發(fā),只要功能完善,體驗到位,鴻蒙應用端直接使用不是很香嗎?

約束與限制

①數據庫中連接池的最大數量是 4 個,用以管理用戶的讀寫操作。

連接池的數量是有限制的 ,最大時 4 個,不過 4 個已經足夠使用了。

②為保證數據的準確性,數據庫同一時間只能支持一個寫操作。

同一時間支持一個寫操作時非常重要的,為了防止數據存儲的正確性,鴻蒙做了這一個限制,但是作為多年的移動端開發(fā)者,一般這種多操作或者大數據操作,都會使用多線程,異步線程,或者放在線程池中,這樣就更完美了。

數據庫操作 DataAbility

鴻蒙在創(chuàng)建類的時候有一個 DataAbility,不知道各位開發(fā)者使用過了沒,其實這個就是為了數據庫操作而來的。

添加步驟很簡單:添加類的時候選擇 Empty DataAbility 即可。

①配置

添加類后,會自動生成如下配置:

{

“permissions”: [

“com.huawei.codelab.DataAbilityShellProvider.PROVIDER”

],

“name”: “com.hadiidbouk.databasemanager.database.DataAbility”,

icon”: “$media:icon”,

“description”: “$string:dataability_description”,

“type”: “data”,

“uri”: “dataability://com.huawei.codelab.PersonDataAbility”

}

操作數據庫需要權限信息

“permissions”: [

“com.huawei.codelab.DataAbilityShellProvider.PROVIDER”

需要配置 url,url 很重要,在進行數據庫表操作的時候需要保持一致。

②DataAbility 操作內容

默認創(chuàng)建的 DataAbility 類會自動重寫 數據庫的增,刪,改,查 幾種操作的函數。

可以看下面:

添加 DataAbility 會自動重寫四個接口函數,有關數據庫的增,刪,改,查。

該 DataAbility 在運行項目后會自行執(zhí)行 onStart 方法進行數據庫及其數據表的創(chuàng)建工作。

通過 RdbPredicates 數據庫進行數據庫關系的關聯(lián)進行操作。

public class DataAbility extends Ability {

private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD001100, “Demo”);

private static final String DB_NAME = “persondataability.db”;

private static final String DB_TAB_NAME = “person”;

private static final String DB_COLUMN_PERSON_ID = “id”;

private static final String DB_COLUMN_NAME = “name”;

private static final String DB_COLUMN_GENDER = “gender”;

private static final String DB_COLUMN_AGE = “age”;

private static final int DB_VERSION = 1;

private StoreConfig config = StoreConfig.newDefaultConfig(DB_NAME);

private RdbStore rdbStore;

private RdbOpenCallback rdbOpenCallback = new RdbOpenCallback() {

@Override

public void onCreate(RdbStore store) {

store.executeSql(“create table if not exists ”

+ DB_TAB_NAME + “ (”

+ DB_COLUMN_PERSON_ID + “ integer primary key, ”

+ DB_COLUMN_NAME + “ text not null, ”

+ DB_COLUMN_GENDER + “ text not null, ”

+ DB_COLUMN_AGE + “ integer)”);

}

@Override

public void onUpgrade(RdbStore store, int oldVersion, int newVersion) {

}

};

@Override

public void onStart(Intent intent) { //創(chuàng)建數據庫操作

super.onStart(intent);

HiLog.info(LABEL_LOG, “DataAbility onStart”);

DatabaseHelper databaseHelper = new DatabaseHelper(this);

rdbStore = databaseHelper.getRdbStore(config, DB_VERSION, rdbOpenCallback, null);

}

// 數據庫 查詢操作

@Override

public ResultSet query(Uri uri, String[] columns, DataAbilityPredicates predicates) {

RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, DB_TAB_NAME);

ResultSet resultSet = rdbStore.query(rdbPredicates, columns);

if (resultSet == null) {

HiLog.info(LABEL_LOG, “resultSet is null”);

}

return resultSet;

}

// 數據庫 插入操作

@Override

public int insert(Uri uri, ValuesBucket value) {

HiLog.info(LABEL_LOG, “DataAbility insert”);

String path = uri.getLastPath();

if (!“person”.equals(path)) {

HiLog.info(LABEL_LOG, “DataAbility insert path is not matched”);

return -1;

}

ValuesBucket values = new ValuesBucket();

values.putInteger(DB_COLUMN_PERSON_ID, value.getInteger(DB_COLUMN_PERSON_ID));

values.putString(DB_COLUMN_NAME, value.getString(DB_COLUMN_NAME));

values.putString(DB_COLUMN_GENDER, value.getString(DB_COLUMN_GENDER));

values.putInteger(DB_COLUMN_AGE, value.getInteger(DB_COLUMN_AGE));

int index = (int) rdbStore.insert(DB_TAB_NAME, values);

DataAbilityHelper.creator(this, uri).notifyChange(uri);

return index;

}

// 數據庫 刪除操作

@Override

public int delete(Uri uri, DataAbilityPredicates predicates) {

RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, DB_TAB_NAME);

int index = rdbStore.delete(rdbPredicates);

HiLog.info(LABEL_LOG, “delete: ” + index);

DataAbilityHelper.creator(this, uri).notifyChange(uri);

return index;

}

// 數據庫 更新操作

@Override

public int update(Uri uri, ValuesBucket value, DataAbilityPredicates predicates) {

RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, DB_TAB_NAME);

int index = rdbStore.update(value, rdbPredicates);

HiLog.info(LABEL_LOG, “update: ” + index);

DataAbilityHelper.creator(this, uri).notifyChange(uri);

return index;

}

@Override

public FileDescriptor openFile(Uri uri, String mode) {

return null;

}

@Override

public String[] getFileTypes(Uri uri, String mimeTypeFilter) {

return new String[0];

}

@Override

public PacMap call(String method, String arg, PacMap extras) {

return null;

}

@Override

public String getType(Uri uri) {

return null;

}

}

③數據庫操作

這里的數據庫操作時,開發(fā)需求做的數據庫操作,可以通過自己的需求來開發(fā)數據庫的調用操作,最終還是通過使用 DataAbility 直接調用系統(tǒng)的數據庫。

public class DataBaseAbilitySlice extends AbilitySlice {

private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD001100, “Demo”);

private DataAbilityHelper databaseHelper;

private static final String BASE_URI = “dataability:///com.huawei.codelab.PersonDataAbility”;

private static final String DATA_PATH = “/person”;

private static final String DB_COLUMN_PERSON_ID = “id”;

private static final String DB_COLUMN_NAME = “name”;

private static final String DB_COLUMN_GENDER = “gender”;

private static final String DB_COLUMN_AGE = “age”;

@Override

public void onStart(Intent intent) {

super.onStart(intent);

super.setUIContent(ResourceTable.Layout_ability_data_base);

databaseHelper = DataAbilityHelper.creator(this);

Text text = (Text)findComponentById(ResourceTable.Id_text_helloworld);

text.setClickedListener(new Component.ClickedListener() {

@Override

public void onClick(Component component) {

query();

insert(100, “Tom”, “male”, 20);

insert(101, “Jerry”, “female”, 21);

insert(102, “Bob”, “male”, 22);

query(); // 查看插入后的結果

update();

query(); // 查看更新后的結果

delete();

query(); // 查看刪除后的結果

}

});

}

@Override

public void onActive() {

super.onActive();

}

@Override

public void onForeground(Intent intent) {

super.onForeground(intent);

}

private void insert(int id, String name, String gender, int age) {

ValuesBucket valuesBucket = new ValuesBucket();

valuesBucket.putInteger(DB_COLUMN_PERSON_ID, id);

valuesBucket.putString(DB_COLUMN_NAME, name);

valuesBucket.putString(DB_COLUMN_GENDER, gender);

valuesBucket.putInteger(DB_COLUMN_AGE, age);

try {

if (databaseHelper.insert(Uri.parse(BASE_URI + DATA_PATH), valuesBucket) != -1) {

// if (databaseHelper.insert(Uri.parse(BASE_URI + DATA_PATH), valuesBucket) != -1) {

HiLog.info(LABEL_LOG, “insert successful”);

}

} catch (DataAbilityRemoteException | IllegalStateException exception) {

HiLog.error(LABEL_LOG, “insert: dataRemote exception|illegalStateException”);

}

}

private void delete() {

DataAbilityPredicates predicates = new DataAbilityPredicates()

.equalTo(DB_COLUMN_PERSON_ID, 100);

try {

if (databaseHelper.delete(Uri.parse(BASE_URI + DATA_PATH), predicates) != -1) {

HiLog.info(LABEL_LOG, “delete successful”);

}

} catch (DataAbilityRemoteException | IllegalStateException exception) {

HiLog.error(LABEL_LOG, “delete: dataRemote exception | illegalStateException”);

}

}

private void update() {

DataAbilityPredicates predicates = new DataAbilityPredicates();

predicates.equalTo(DB_COLUMN_PERSON_ID, 102);

ValuesBucket valuesBucket = new ValuesBucket();

valuesBucket.putString(DB_COLUMN_NAME, “ZhangSanPlus”);

valuesBucket.putInteger(DB_COLUMN_AGE, 28);

try {

if (databaseHelper.update(Uri.parse(BASE_URI + DATA_PATH), valuesBucket, predicates) != -1) {

HiLog.info(LABEL_LOG, “update successful”);

}

} catch (DataAbilityRemoteException | IllegalStateException exception) {

HiLog.error(LABEL_LOG, “update: dataRemote exception | illegalStateException”);

}

}

private void query() {

String[] columns = new String[] {DB_COLUMN_PERSON_ID,

DB_COLUMN_NAME, DB_COLUMN_GENDER, DB_COLUMN_AGE};

// 構造查詢條件

DataAbilityPredicates predicates = new DataAbilityPredicates();

predicates.between(DB_COLUMN_AGE, 15, 40); // 查詢時間段

try {

ResultSet resultSet = databaseHelper.query(Uri.parse(BASE_URI + DATA_PATH),

columns, predicates);

if (resultSet == null || resultSet.getRowCount() == 0) {

HiLog.info(LABEL_LOG, “query: resultSet is null or no result found”);

return;

}

resultSet.goToFirstRow();

do {

int id = resultSet.getInt(resultSet.getColumnIndexForName(DB_COLUMN_PERSON_ID));

String name = resultSet.getString(resultSet.getColumnIndexForName(DB_COLUMN_NAME));

String gender = resultSet.getString(resultSet.getColumnIndexForName(DB_COLUMN_GENDER));

int age = resultSet.getInt(resultSet.getColumnIndexForName(DB_COLUMN_AGE));

HiLog.info(LABEL_LOG, “query: Id :” + id + “ Name :” + name + “ Gender :” + gender + “ Age :” + age);

} while (resultSet.goToNextRow());

} catch (DataAbilityRemoteException | IllegalStateException exception) {

HiLog.error(LABEL_LOG, “query: dataRemote exception | illegalStateException”);

}

}

}

數據插入使用對象類 ValuesBucket;使用 DataAbilityPredicates 實例進行數據查詢的條件設置。

到此有關數據庫的關系型數據庫操作基本就完成了,是不是非常,非常簡單,可以直接拿來主義驗證一下。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數據庫
    +關注

    關注

    7

    文章

    3799

    瀏覽量

    64389
  • 中軟國際
    +關注

    關注

    0

    文章

    520

    瀏覽量

    7193
  • 鴻蒙系統(tǒng)

    關注

    183

    文章

    2634

    瀏覽量

    66344
  • HarmonyOS
    +關注

    關注

    79

    文章

    1975

    瀏覽量

    30194

原文標題:鴻蒙的關系型數據庫,被驚艷到了!

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區(qū)】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    數據庫數據恢復—Mysql數據庫表記錄丟失的數據恢復流程

    Mysql數據庫故障: Mysql數據庫表記錄丟失。 Mysql數據庫故障表現(xiàn): 1、Mysql數據庫表中無任何數據或只有部分
    的頭像 發(fā)表于 12-16 11:05 ?152次閱讀
    <b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復—Mysql<b class='flag-5'>數據庫</b>表記錄丟失的<b class='flag-5'>數據</b>恢復流程

    數據庫數據恢復—MYSQL數據庫ibdata1文件損壞的數據恢復案例

    mysql數據庫故障: mysql數據庫文件ibdata1、MYI、MYD損壞。 故障表現(xiàn):1、數據庫無法進行查詢等操作;2、使用mysqlcheck和myisamchk無法修復數據庫
    的頭像 發(fā)表于 12-09 11:05 ?154次閱讀

    數據庫和云主機哪個好一?

    數據庫和云主機哪個好一?云主機和云數據庫各有優(yōu)勢,選擇哪個更好取決于具體需求。云主機提供虛擬化的計算資源,適用于運行各種應用;而云數據庫專注于
    的頭像 發(fā)表于 12-04 13:50 ?130次閱讀

    接口測試理論、疑問收錄與擴展相關知識點

    本文章使用王者榮耀游戲接口、企業(yè)微信接口的展示結合理論知識,講解什么是接口測試、接口測試理論、疑問收錄與擴展相關知識點知識學院,快來一起看看吧~
    的頭像 發(fā)表于 11-15 09:12 ?315次閱讀
    接口測試理論、疑問收錄與擴展相關<b class='flag-5'>知識點</b>

    數據庫數據恢復—通過拼接數據庫碎片恢復SQLserver數據庫

    一個運行在存儲上的SQLServer數據庫,有1000多個文件,大小幾十TB。數據庫每10天生成一個NDF文件,每個NDF幾百GB大小。數據庫包含兩個LDF文件。 存儲損壞,數據庫
    的頭像 發(fā)表于 10-31 13:21 ?224次閱讀
    <b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復—通過拼接<b class='flag-5'>數據庫</b>碎片恢復SQLserver<b class='flag-5'>數據庫</b>

    Oracle數據恢復—異常斷電后Oracle數據庫報錯的數據恢復案例

    Oracle數據庫故障: 機房異常斷電后,Oracle數據庫報錯:“system01.dbf需要更多的恢復來保持一致性,數據庫無法打開”。數據
    的頭像 發(fā)表于 09-30 13:31 ?305次閱讀
    Oracle<b class='flag-5'>數據</b>恢復—異常斷電后Oracle<b class='flag-5'>數據庫</b>啟<b class='flag-5'>庫</b>報錯的<b class='flag-5'>數據</b>恢復案例

    數據庫數據恢復—SQL Server數據庫出現(xiàn)823錯誤的數據恢復案例

    SQL Server數據庫故障: SQL Server附加數據庫出現(xiàn)錯誤823,附加數據庫失敗。數據庫沒有備份,無法通過備份恢復數據庫
    的頭像 發(fā)表于 09-20 11:46 ?351次閱讀
    <b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復—SQL Server<b class='flag-5'>數據庫</b>出現(xiàn)823錯誤的<b class='flag-5'>數據</b>恢復案例

    數據庫數據恢復—SQL Server數據庫所在分區(qū)空間不足報錯的數據恢復案例

    SQL Server數據庫數據恢復環(huán)境: 某品牌服務器存儲中有兩組raid5磁盤陣列。操作系統(tǒng)層面跑著SQL Server數據庫,SQL Server數據庫存放在D盤分區(qū)中。
    的頭像 發(fā)表于 07-10 13:54 ?499次閱讀

    鴻蒙開發(fā)接口數據管理:【@ohos.data.rdb (關系型數據庫)】

    關系型數據庫(Relational Database,RDB)是一種基于關系模型來管理數據數據庫。關系型數據庫基于SQLite組件提供了一套完整的對本地
    的頭像 發(fā)表于 06-10 18:35 ?1327次閱讀

    鴻蒙的1萬個理由,北京中關村現(xiàn)大幅鴻蒙海報

    的 『贊和評論』,才是我創(chuàng)造的動力。 關注小編,同時可以期待后續(xù)文章ing?,不定期分享原創(chuàng)知識。 更多鴻蒙最新技術知識點,請關注作者博客:鴻蒙
    發(fā)表于 05-08 20:31

    模擬電子技術知識點問題總結概覽

    給大家分享模擬電子技術知識點問題總結。
    的頭像 發(fā)表于 05-08 15:16 ?1169次閱讀
    模擬電子技術<b class='flag-5'>知識點</b>問題總結概覽

    數據庫數據恢復—raid5陣列上層Sql Server數據庫數據恢復案例

    數據庫數據恢復環(huán)境: 5塊硬盤組建一組RAID5陣列,劃分LUN供windows系統(tǒng)服務器使用。windows系統(tǒng)服務器內運行了Sql Server數據庫,存儲空間在操作系統(tǒng)層面劃分了三個邏輯分區(qū)
    的頭像 發(fā)表于 05-08 11:43 ?512次閱讀
    <b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復—raid5陣列上層Sql Server<b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復案例

    數據庫數據恢復】Oracle數據庫ASM實例無法掛載的數據恢復案例

    oracle數據庫ASM磁盤組掉線,ASM實例不能掛載。數據庫管理員嘗試修復數據庫,但是沒有成功。
    的頭像 發(fā)表于 02-01 17:39 ?524次閱讀
    【<b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復】Oracle<b class='flag-5'>數據庫</b>ASM實例無法掛載的<b class='flag-5'>數據</b>恢復案例

    鴻蒙知識點

    1、鴻蒙上的類似adb的工具名叫hdc hdc(HarmonyOS Device Connector)是HarmonyOS為開發(fā)人員提供的用于調試的命令行工具,通過該工具可以在window
    的頭像 發(fā)表于 01-31 17:40 ?945次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>知識點</b>

    Access數據庫基礎知識介紹

    電子發(fā)燒友網站提供《Access數據庫基礎知識介紹.pdf》資料免費下載
    發(fā)表于 01-02 10:24 ?3次下載