介紹
分布式數(shù)據(jù)服務(wù)(Distributed Data Service,DDS)為應(yīng)用程序提供不同設(shè)備間數(shù)據(jù)分布式的能力。通過(guò)調(diào)用分布式數(shù)據(jù)接口,應(yīng)用程序?qū)?shù)據(jù)保存到分布式數(shù)據(jù)庫(kù)中。通過(guò)結(jié)合帳號(hào)、應(yīng)用和分布式數(shù)據(jù)服務(wù)對(duì)屬于不同的應(yīng)用的數(shù)據(jù)進(jìn)行隔離,保證不同應(yīng)用之間的數(shù)據(jù)不能通過(guò)分布式數(shù)據(jù)服務(wù)互相訪問(wèn)。在通過(guò)可信認(rèn)證的設(shè)備間,分布式數(shù)據(jù)服務(wù)支持應(yīng)用數(shù)據(jù)相互同步,為用戶提供在多種終端設(shè)備上一致的數(shù)據(jù)訪問(wèn)體驗(yàn)。效果圖如下:
圖 1 []()
搭建OpenHarmony環(huán)境
完成本篇Codelab我們首先要完成開(kāi)發(fā)環(huán)境的搭建,本示例以Hi3516DV300開(kāi)發(fā)板為例,參照以下步驟進(jìn)行:
- [獲取OpenHarmony系統(tǒng)版本]:標(biāo)準(zhǔn)系統(tǒng)解決方案(二進(jìn)制)
以3.0版本為例: - 搭建燒錄環(huán)境
- 搭建開(kāi)發(fā)環(huán)境
- 開(kāi)始前請(qǐng)參考[工具準(zhǔn)備],完成DevEco Studio的安裝和開(kāi)發(fā)環(huán)境配置。
- 開(kāi)發(fā)環(huán)境配置完成后,請(qǐng)參考[使用工程向?qū)創(chuàng)建工程(模板選擇“Empty Ability”),選擇JS或者eTS語(yǔ)言開(kāi)發(fā)。
- 工程創(chuàng)建完成后,選擇使用[真機(jī)進(jìn)行調(diào)測(cè)]。
代碼結(jié)構(gòu)解讀
本篇Codelab只對(duì)核心代碼進(jìn)行講解,對(duì)于完整代碼,我們會(huì)在最后的參考中提供下載方式,接下來(lái)我們來(lái)講解整個(gè)工程的代碼結(jié)構(gòu):
- pages:用于存放所有頁(yè)面的目錄。
- index:構(gòu)成關(guān)系型數(shù)據(jù)庫(kù)操作界面,包括index.hml布局文件,index.css樣式文件,index.js邏輯處理文件。
- KvStoreModel.js:創(chuàng)建分布式數(shù)據(jù)庫(kù),以及提供表格數(shù)據(jù)的增、刪、改、查API接口。
- config.json:配置文件。
分布式組網(wǎng)
硬件準(zhǔn)備:準(zhǔn)備兩臺(tái)燒錄相同的版本系統(tǒng)的Hi3516DV300開(kāi)發(fā)板A,B。
兩個(gè)開(kāi)發(fā)板A,B配置在同一個(gè)WiFi網(wǎng)絡(luò)之下。
打開(kāi)設(shè)置-->WLAN-->點(diǎn)擊右側(cè)WiFi開(kāi)關(guān)-->點(diǎn)擊目標(biāo)WiFi并輸入密碼。將設(shè)備A,B設(shè)置為互相信任的設(shè)備。
- 找到系統(tǒng)應(yīng)用“音樂(lè)”。
- 設(shè)備A打開(kāi)音樂(lè),點(diǎn)擊左下角流轉(zhuǎn)按鈕,彈出列表框,在列表中會(huì)展示遠(yuǎn)端設(shè)備的id。
- 選擇遠(yuǎn)端設(shè)備B的id,另一臺(tái)開(kāi)發(fā)板(設(shè)備B)會(huì)彈出驗(yàn)證的選項(xiàng)框。
- 設(shè)備B點(diǎn)擊允許,設(shè)備B將會(huì)彈出隨機(jī)PIN碼,將設(shè)備B的PIN碼輸入到設(shè)備A的PIN碼填入框中。
配網(wǎng)完畢。
創(chuàng)建分布式數(shù)據(jù)庫(kù)
- 導(dǎo)入模塊
import distributedData from '@ohos.data.distributeddata';
- 參考分布式數(shù)據(jù)庫(kù)[接口],在kvStoreModel類中定義KvManager和KvStore變量,并通過(guò)createKVManager創(chuàng)建分布式數(shù)據(jù)庫(kù)管理對(duì)象KvManager,通過(guò)getKVStore獲取數(shù)據(jù)庫(kù)操作實(shí)例KvStore。其中config表示創(chuàng)建KVManager實(shí)例的配置信息,包括調(diào)用方的包名和用戶信息。options表示創(chuàng)建 KvStore實(shí)例的配置信息。表示示例代碼如下:
export default class KvStoreModel {
kvManager;
kvStore;
constructor() {
}
createKvStore(callback) {
if (typeof (this.kvStore) === 'undefined') {
//創(chuàng)建KVManager實(shí)例的配置信息
var config = {
bundleName: 'com.ohos.distributedmusicplayer',
userInfo: {
userId: '0',
userType: 0
}
};
let self = this;
distributedData.createKVManager(config).then((manager) = > {
self.kvManager = manager;
//創(chuàng)建 KvStore實(shí)例的配置信息
var options = {
createIfMissing: true,
encrypt: false,
backup: false,
autoSync: true,
kvStoreType: 1,
schema: '',
securityLevel: 3,
};
self.kvManager.getKVStore(STORE_ID, options).then((store) = > {
self.kvStore = store;
callback();
});
});
} else {
callback();
}
}
}
操作分布式數(shù)據(jù)方法
創(chuàng)建分布式數(shù)據(jù)庫(kù)后,獲得一個(gè)KvStore,通過(guò)KvStore調(diào)用相關(guān)接口執(zhí)行相關(guān)的數(shù)據(jù)操作,結(jié)果以Promise形式返回。
- 添加鍵值對(duì)到數(shù)據(jù)庫(kù):使用put()方法,該方法接收兩個(gè)參數(shù),分別是要添加的數(shù)值Key和要添加的數(shù)值。示例代碼如下:
put(key, value) { this.kvStore.put(key, value).then((data) = > { this.kvStore.get(key).then((data) = > { }); }).catch((err) = > { }); }
- 數(shù)據(jù)庫(kù)中刪除指定鍵值對(duì)的數(shù)據(jù):使用delete()方法,該方法接收一個(gè)參數(shù),需要?jiǎng)h除數(shù)據(jù)的鍵值key,結(jié)果以Promise形式返回。示例代碼如下:
delete(key) { this.kvStore.delete(key).then((data) = > { }).catch((err) = > { }); }
- 數(shù)據(jù)庫(kù)中獲取指定鍵值對(duì)的數(shù)據(jù):使用get()方法,該方法接收兩個(gè)參數(shù),分別是需要獲取數(shù)據(jù)的鍵值key和返回函數(shù)callback,結(jié)果以callback函數(shù)形式返回。示例代碼如下:
get(key,callback){ this.kvStore.get(key).then((data) = > { callback(data); }); }
同步分布式數(shù)據(jù)庫(kù)
通常情況下,當(dāng)數(shù)據(jù)庫(kù)的數(shù)據(jù)產(chǎn)生變化時(shí),需要主動(dòng)通知與該數(shù)據(jù)相關(guān)聯(lián)的進(jìn)程或者應(yīng)用,從而使得相關(guān)進(jìn)程或者應(yīng)用接收到數(shù)據(jù)變化后完成相應(yīng)的處理。對(duì)于數(shù)據(jù)提供方,當(dāng)數(shù)據(jù)庫(kù)數(shù)據(jù)變化,可以通過(guò)如下方法通知數(shù)據(jù)訂閱者:
broadcastMessage(key, value) {
let self = this;
this.createKvStore(() = > {
self.put(key, value);//self.delete(key)新增或者刪除數(shù)據(jù)都可導(dǎo)致數(shù)據(jù)變化
});
}
對(duì)于數(shù)據(jù)接收方,可以通過(guò)KvStore提供的[on]方法注冊(cè)一個(gè)數(shù)據(jù)訂閱者。示例代碼如下:
setOnMessageReceivedListener(callback) {
let self = this;
this.createKvStore(() = > {
self.kvStore.on('dataChange', 1, (data) = > {
for (var i = 0; i < data.insertEntries.length; i++) {
callback(data.insertEntries[0].key, data.insertEntries[0].value.value, 0);
return;
}
for (i = 0; i < data.updateEntries.length; i++) {
callback(data.updateEntries[0].key, data.updateEntries[0].value.value, 1);
return;
}
for (i = 0; i < data.deleteEntries.length; i++) {
callback(data.deleteEntries[0].key, '', 2);
return;
}
});
});
}
審核編輯 黃宇
-
分布式數(shù)據(jù)
+關(guān)注
關(guān)注
0文章
9瀏覽量
9044 -
鴻蒙
+關(guān)注
關(guān)注
60文章
2620瀏覽量
44052 -
HarmonyOS
+關(guān)注
關(guān)注
80文章
2126瀏覽量
33054 -
OpenHarmony
+關(guān)注
關(guān)注
29文章
3854瀏覽量
18608
發(fā)布評(píng)論請(qǐng)先 登錄
HarmonyOS開(kāi)發(fā)實(shí)例:【分布式數(shù)據(jù)管理】

HarmonyOS Next 應(yīng)用元服務(wù)開(kāi)發(fā)-分布式數(shù)據(jù)對(duì)象遷移數(shù)據(jù)權(quán)限與基礎(chǔ)數(shù)據(jù)
HarmonyOS應(yīng)用開(kāi)發(fā)-分布式任務(wù)調(diào)度
HarmonyOS應(yīng)用開(kāi)發(fā)-分布式設(shè)計(jì)
HarmonyOS分布式數(shù)據(jù)庫(kù),為啥這么牛?
HarmonyOS教程—分布式運(yùn)動(dòng)健康應(yīng)用(智能穿戴端)
HarmonyOS原子化服務(wù)卡片開(kāi)發(fā)-分布式體驗(yàn)學(xué)習(xí)
HarmonyOS教程—基于分布式數(shù)據(jù)接口,實(shí)現(xiàn)多種設(shè)備上一致的數(shù)據(jù)訪問(wèn)體驗(yàn)
HarmonyOS分布式應(yīng)用框架深入解讀
HDC2021技術(shù)分論壇:如何高效完成HarmonyOS分布式應(yīng)用測(cè)試?
如何高效完成HarmonyOS分布式應(yīng)用測(cè)試?
HarmonyOS測(cè)試技術(shù)與實(shí)戰(zhàn)-HarmonyOS分布式應(yīng)用特征與挑戰(zhàn)

基于鴻蒙分布式數(shù)據(jù)服務(wù)開(kāi)發(fā)的聊天室應(yīng)用
基于鴻蒙分布式數(shù)據(jù)服務(wù)開(kāi)發(fā)的聊天室應(yīng)用
HarmonyOS分布式應(yīng)用上架問(wèn)題分析

評(píng)論