OpenHarmony—分布式數據對象之功能實踐
分布式數據對象之功能實踐
分布式數據對象管理框架是一款面向對象的內存數據管理框架,向應用開發者提供內存對象的創建、查詢、刪除、修改、訂閱等基本數據對象的管理能力,同時具備分布式能力,滿足超級終端場景下,相同應用多設備間的數據對象協同需求。
1、 基本概念
分布式數據對象提供JS接口,讓開發者能以使用本地對象的方式使用分布式對象。
2、 運作示意圖
3、約束與限制
- 不同設備間只有相同bundleName的應用才能直接同步。
- 不建議創建過多分布式對象,每個分布式對象將占用100-150KB內存。
- 每個對象大小不超過500KB。
- 支持JS接口間的互通,與其他語言不互通。
4、開發指導
(1) 接口說明
引用分布式對象頭文件:
import distributedObject from '@ohos.data.distributedDataObject'
接口:
DistrubutedObject:
5、 開發步驟
(1) 引入接口
import distributedObject from '@ohos.data.distributedDataObject'
(2) 創建對象
// 創建對象,對象包含3個基本屬性:name,age和isVis;2個復雜屬性:parent,list
var g_object = distributedObject.createDistributedObject({name:undefined, age:undefined, isVis:true, parent:undefined, list:undefined});
說明:**構造分布式對象時,新增了默認SESSION_ID屬性,并為各屬性增加了set和get方法,其構造方法如下所示:
const SESSION_ID = "__sessionId";
class Distributed {
constructor(obj) {
this.__proxy = obj;
Object.keys(obj).forEach(key => {
Object.defineProperty(this, key, {
enumerable: true,
configurable: true,
get: function () {
return this.__proxy[key];
},
set: function (newValue) {
this.__proxy[key] = newValue;
}
});
});
Object.defineProperty(this, SESSION_ID, {
enumerable: true,
configurable: true,
get: function () {
return this.__proxy[SESSION_ID];
},
set: function (newValue) {
this.__proxy[SESSION_ID] = newValue;
}
});
this.__objectId = randomNum();
console.info("constructor success ");
}
//------------------------------------------------------其余內容此處省略
__proxy;
__objectId;
}
(3) 加入同步組網
發起方:
用distributedObject.genSessionId()方法生成隨機字符串,并設置為對象的__sessionId屬性的值。
g_object.setSessionId(distributedObject.genSessionId());
說明:**setSessionId不僅設置了SESSION_ID屬性的值,也重新打包了對象,增加了該SESSION_ID對應同步組網的內容,具體方法如下:
setSessionId(sessionId) {
if (sessionId == null || sessionId == "") {
leaveSession(this.__proxy); //退出同步組網
return false;
}
if (this.__proxy[SESSION_ID] == sessionId) {
console.info("same session has joined " + sessionId);
return true;
}
leaveSession(this.__proxy); //退出同步組網
//加入sessionId值對應的同步組網,返回新生成的對象
let object = joinSession(this.__proxy, this.__objectId, sessionId);
if (object != null) {
this.__proxy = object;//替換新生成的對象
return true;
}
return false;
}
被拉起方:
發起方將sessionId通過Intent傳到對端設備,被拉起方獲取Intent中的sessionId,執行setSessionId加入同步組網完成數據同步。
//sessionId與發起方的__sessionId一致
g_object.setSessionId(sessionId);
(4) 監聽對象變更
開啟change監聽,當同步組網內對象屬性value發生變化時,觸發用戶自定義回調changeCallback。
changeCallback : function (sessionId, changeData) {
console.info("change" + sessionId + " " + this.response);
if (changeData != null && changeData != undefined) {
changeData.forEach(element => {
console.info("changed !" + element + " " + g_object[element]);
});
}
}
g_object.on("change", this.changeCallback);
(5)修改對象屬性
g_object.name = "jack";
g_object.age = 19;
g_object.isVis = false;
g_object.parent = {mother:"jack mom",father:"jack Dad"};
g_object.list = [{mother:"jack mom"}, {father:"jack Dad"}];
// 對端設備收到change回調,fields為name,age,isVis,parent和list
說明: 針對復雜類型的數據修改,目前支持對根屬性的修改,暫不支持對下級屬性的修改。示例如下:
//支持的修改方式
g_object.parent = {mother:"mom", father:"dad"};
//不支持的修改方式
g_object.parent.mother = "mom";
(6) 訪問對象
console.info("name " + g_object["name"]); //訪問到的是組網內最新數據
(7)刪除監聽數據變更
//刪除變更回調changeCallback
g_object.off("change", changeCallback);
//刪除所有的變更回調
g_object.off("change");
(8) 監聽分布式對象的上下線
開啟status監聽,當同步組網內有對象在線狀態發生變化時,觸發用戶自定義回調statusCallback。
statusCallback : function (sessionId, networkid, status) {
this.response += "status changed " + sessionId + " " + status + " " + networkId;
}
g_object.on("status", this.changeCallback);
(9) 刪除監聽分布式對象的上下線
//刪除上下線回調changeCallback
g_object.off("status", changeCallback);
//刪除所有的上下線回調
g_object.off("status");
(10)退出同步組網
//兩種方式均可
g_object.setSessionId("");
g_object.setSessionId();
6 、內部實現
(1) 主要接口
class DistributedObjectStoreImpl : public DistributedObjectStore
{
public:
DistributedObject *CreateObject(const std::string &sessionId) override;
uint32_t DeleteObject(const std::string &sessionId) override;
//此處的watch主要針對change監聽
uint32_t Watch(DistributedObject *object, std::shared_ptr<ObjectWatcher> watcher) override;
uint32_t UnWatch(DistributedObject *object) override;
//其余內容省略
}
(2)調用順序
7 、總結
通過本文的學習可了解到分布式數據對象的主要接口、大致調用方法和功能實現等。結合對應內容,可以進一步對分布式數據對象同步機制做深度學習。
下一步:
(1) 著重理解同步組網的構建原理。
(2) 著重理解同步組網內,監聽change和status變化的實現。