鴻蒙原生應用開發【分布式數據對象】

01、什么是分布式數據對象

在可信組網環境下,多個相互組網認證的設備將各自創建的對象加入同一個 sessionId,使得加入的多個數據對象之間可以同步數據,也就是說,當某一數據對象屬性發生變更時,其他數據對象會檢測到這一變更,同時將自身屬性更新。此時,該 sessionId 下的所有數據對象屬性相同,這樣的數據對象稱之為分布式數據對象。此外,分布式數據對象可以被動退出 sessionId,當分布式數據對象退出 sessionId 后,該對象將檢測不到其他對象的變更。

02、分布式數據對象能力

1、 分布式數據對象創建
2、 分布式數據對象查詢
3、 分布式數據對象修改
4、 分布式數據對象刪除
5、 分布式數據對象保存
6、 分布式數據對象訂閱(數據變更,上下線)
7、分布式數據對象加入、退出分布式組網

03、前提準備

1、 開發工具:DevEco Studio 3.1.0.501
2、API:9
3、 SDK 版本:3.2.12.5

04、創建一個新的項目

新建項目,選擇 API9 版本,stage 模型。

05、權限申請

1、 使用到的權限

○ ohos.permission.DISTRIBUTED_DATASYNC

○ 允許不同設備間的數據交換

○ 權限級別:normal

○ 授權方式:user_grant

○ ACL 使能:TRUE

2、配置文件申明

首先,在項目的模塊級目錄下找到并打開 module.json5 文件,如下圖:

在 module 下的對象里添加如下申明:

此時,配置文件中的權限申明就完成了,但是,此時我們還不能獲得這些權限。由于 ohos.permission.DISTRIBUTED_DATASYNC 權限是 ACL 使能為 TRUE 的權限,需要在簽名工具文件中說明一下。

如何找到對應的簽名工具文件呢?我們在安裝 DevEco Studio 的時候是下載好了 OpenHarmony 的 SDK 的,此時在 OpenHarmony 文件夾中,打開 “Sdk\OpenHarmony SDK 版本\toolchains\lib” 該路徑,此時在 lib 文件夾中,咱們可以找到兩個 json 文件,分別為 UnsgnedDebugProfileTemplate.json 和 UnsgnedReleasedProfileTemplate.json,點擊并打開這兩個文件,添加如下權限:

3、權限申請編碼

在申請 ohos.permission.DISTRIBUTED_DATASYNC 權限時,其文檔中將其標注為用戶手動授權的權限,此時需要我們動態申請權限,在項目中,我們新建一個 ets 文件,我這里取名為 RequestPermission.ets。

首先,導入以下包:

import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
import bundleManager from '@ohos.bundle.bundleManager';
import common from '@ohos.app.ability.common';

獲取訪問控制模塊對象實例:

let atManager = abilityAccessCtrl.createAtManager();

編寫如下方法(這里使用的是異步函數):

export async function checkAccessTokenID(permission: Array<Permissions>) {// 獲取應用程序的accessTokenIDlet tokenId: number;let grantStatus: Array<abilityAccessCtrl.GrantStatus> = []try {let bundleInfo: bundleManager.BundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;tokenId = appInfo.accessTokenId;} catch (err) {console.error(`getBundleInfoForSelf failed, code is ${err.code}, message is ${err.message}`);}// 校驗應用是否被授予權限,若申請多個權限,建議循環檢查多個權限for (let index = 0;index < permission.length; index++) {try {grantStatus.push(await atManager.checkAccessToken(tokenId, permission[index]))} catch (err) {console.error(`checkAccessToken failed, code is ${err.code}, message is ${err.message}`);}}return grantStatus;
}export async function checkPermission(context: common.UIAbilityContext, permissions: Array<Permissions>) {let grantStatus: Array<abilityAccessCtrl.GrantStatus> = await checkAccessTokenID(permissions)for (let i = 0; i < grantStatus.length; i++) {if (grantStatus[i] === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {console.info(`${permissions[i].toString()} 已授權`)} else {//申請權限console.info('開始向用戶申請權限')requestPermissionFromUser(context, permissions)}}
}
export async function requestPermissionFromUser(context: common.UIAbilityContext, permissions: Array<Permissions>) {// requestPermissionsFromUser會判斷權限的授權狀態來決定是否喚起彈窗atManager.requestPermissionsFromUser(context, permissions).then((data) => {let grantStatus: Array<number> = data.authResultslet length: number = grantStatus.lengthfor (let i = 0;i < length; i++) {if (grantStatus[i] === 0) {// 用戶授權,可以繼續訪問目標操作console.info(`${permissions[i].toString()} 權限申請成功`)} else {// 用戶拒絕授權,提示用戶必須授權才能訪問當前頁面的功能,并引導用戶到系統設置中打開相應的權限console.info(`${permissions[i].toString()} 權限申請被用戶拒絕`)}}// 授權成功})
}

此時,我們申請權限的方法就算編寫完成了,在應用入口,即 EntryAbility.ts 文件中的

onCreate(want: Want, launchParam: AbilityConstant.LaunchParam)

方法中回調權限申請函數:

requestPermissionFromUser(this.context, PERMISSIONS)

其中,PERMISSIONS 定義如下:const PERMISSIONS:Array=[‘ohos.permission.DISTRIBUTED_DATASYNC’]

到此,我們的權限申請就算完完全全完成啦,當用戶第一次安裝并打開應用的時候,應用會向用戶通過彈窗形式申請權限,用戶點擊授權即可賦予應用相應的權限啦~

06、上手分布式數據對象代碼開發

登錄了同一華為帳號的 HarmonyOS 設備已經默認了進行了組網認證,所以在進行分布式數據對象開發之前無需再進行多設備組網認證這一階段的開發,開發變得相對簡單了起來。首先,咱們制作一個簡易 UI 界面(UI 界面僅供參考),如下圖所示:

相信對于有 HarmonyOS 開發經驗的小伙伴們來說這樣的 UI 界面制作并不困難,其中紅色圓點、綠色圓點為設備狀態,當設備狀態發生改變如下線時,顏色變為紅色,UI 界面代碼如下:

import router from '@ohos.router'
import { DistributedDeviceManageFunc } from '../modules/DistributedDeviceManager/DistributedDeviceManagerFunctions'
import DistributedObjectFunc from '../modules/DistributedObject/DistributedObjectFunctions'
import { ContinuationDeviceManagerDialog } from '../view/ContinuationDeviceManagerDialog'
import { DistributedDeviceManagerDialog } from '../view/DistributedDeviceManagerDialog'AppStorage.SetOrCreate('distributedDeviceList', [])
AppStorage.SetOrCreate('message', '分布式數據對象Demo測試')
AppStorage.SetOrCreate('statusColor', '#ff4fc100')
AppStorage.SetOrCreate('distributedColor', '#ffff0000')@Entry
@Component
struct DistributedObjectDemo {@StorageLink('message') message: string = ''@StorageLink('statusColor') statusColor: string = ''@StorageLink('distributedColor') distributedColor: string = ''@StorageLink('distributedObj') distributedObj: DistributedObjectFunc = new DistributedObjectFunc()@BuildernavigationTitle() {Row({ space: '10vp' }) {Button({ type: ButtonType.Normal }) {Image($rawfile('ic_public_back.svg')).size({width: '24vp',height: '24vp'})}.width('36vp').height('36vp').backgroundColor(Color.White).borderRadius('10vp').onClick(() => {DistributedDeviceManageFunc.release()router.back()})Text('分布式數據對象測試').fontWeight(FontWeight.Bold).fontSize('20vp')Blank()Button({ type: ButtonType.Normal }) {Image($rawfile('ic_public_connection_filled.svg')).size({width: '24vp',height: '24vp'})}.width('36vp').height('36vp').backgroundColor(Color.White).borderRadius('10vp').onClick(() => {this.distributedDeviceManagerDialogController.open()})}.padding('5vp').width('90%')}build() {Navigation() {Column({ space: '20vp' }) {Row({ space: '20vp' }) {Text(`設備狀態`).fontSize('20vp').fontWeight(FontWeight.Bold)Circle().width('25vp').height('25vp').fill(this.statusColor)}Row({ space: '20vp' }) {Text(`對端設備狀態`).fontSize('20vp').fontWeight(FontWeight.Bold)Circle().width('25vp').height('25vp').fill(this.distributedColor)}Text(`SessionID:${this.distributedObj.getSessionId()}`).fontSize('20vp').fontWeight(FontWeight.Bold)Text(this.message).fontSize('20vp').fontWeight(FontWeight.Bold).maxLines(2)Button('保存分布式數據對象').buttonStyles().onClick(() => {this.distributedObj.saveDistributedObject()})Button('修改分布式數據對象').buttonStyles().onClick(() => {this.distributedObj.updateDistributedObject()})Button('退出組網').buttonStyles().onClick(() => {this.distributedObj.exit()router.back()})}.width('100%')}.width('100%').height('100%').mode(NavigationMode.Auto).titleMode(NavigationTitleMode.Mini).hideBackButton(true).title(this.navigationTitle())}
}@Extend(Button) function buttonStyles() {.fontSize('20vp').width('60%').height('50vp')
}

現在,我們的頁面制作就完成啦,下面開始重頭戲——分布式數據對象開發流程

1、導入模塊

import distributedObject from '@ohos.data.distributedDataObject'

2、初始化 distributedObject. DataObject 對象

定義一個 distributedObject. DataObject 類型的變量。

mDistributedObject: distributedObject.DataObject

調用 distributedObject. Create()函數創建一個 distributedObject. DataObject 對象,并將其返回給定義的變量 mDistributedObject。

this.mDistributedObject = distributedObject.create(globalThis.context, {name: 'jack',age: 18,isVis: false
})

在 create()方法中存在兩個參數,context 和 resource,context 的類型為 Context,resource 類型為 object,在這里我是在 entryAbility.ts 文件下的 onWindowStageCreate()方法里面定義了一個全局變量 globalThis.context。

globalThis.context = this.context

3、設置組網 sessionId

this.mDistributedObject.setSessionId(this.mSessionId)

在 setSessionId()函數中,參數 sessionId 為 string 類型,表示分布式對象組網唯一標識符,設置同步的 sessionId,當可信組網中有多個設備時,多個設備間的對象如果設置為同一個 sessionId,就能自動同步。

4、開啟設備狀態監聽

globalThis.statusCallback = (sessionId: string, networkId: string, status: string) => {AppStorage.Set('message', `組網設備狀況變更,id:${sessionId} status:${status} networkId:${networkId}`)if (status == 'online') {AppStorage.Set('distributedColor', '#ff4fc100')} else if (status == 'offline') {AppStorage.Set('distributedColor', '#ffff0000')}
}
this.mDistributedObject.on("status", globalThis.statusCallback)

(sessionId: string, networkId: string, status: string)為 callback 回調函數返回的值,我們可以使用這些返回值判斷設備上下線狀態,其中 status 參數返回值為 online 或者 offline,表示設備對端設備上下線。

5、開啟分布式數據對象同步監聽

globalThis.changeCallback = (sessionId: string, fields: Array<string>) => {console.info('分布式數據對象發生變化')if (fields != null && fields != undefined) {AppStorage.Set('message', `data change:${fields} sessionId:${sessionId}`)}
}
this.mDistributedObject.on("change", globalThis.changeCallback)

當同一組網內分布式數據對象發生改變時,同一組網中的所有分布式數據對象同步發生變化,變化后的值為某一分布式數據對象改變后的值(sessionId: string, fields: Array)為 callback 回調函數返回值,其中,sessionId 為組網唯一標識符,field 為分布式數據對象的數據變更列表。

此時此刻,分布式數據對象就基本上開發完成啦。

如果有小伙伴想要修改分布式數據對象的屬性,可以直接修改

// @ts-ignore
this.mDistributedObject.name = 'lucy'
// @ts-ignore
this.mDistributedObject.age = 25

注意:根據當前版本 IDE 的編碼插件情況,不能直接寫 this.mDistributedObject.age = 25,此時咱們需要加上// @ts-ignore 就可以啦。

最后,使用完分布式數據對象后大家要記得釋放資源哦(注銷所有監聽,退出組網 sessionId,將分布式數據對象設置為空值)

this.mDistributedObject.off("change")
this.mDistributedObject.off("status")
this.mDistributedObject.setSessionId()
this.mDistributedObject = null
this.mSessionId = null

如果有小伙伴有兩部或兩部以上的華為設備,可以將程序燒錄到設備中,體驗一下分布式數據對象能力的快樂~

為了能讓大家更好的學習鴻蒙 (Harmony OS) 開發技術,這邊特意整理了《鴻蒙 (Harmony OS)開發學習手冊》(共計890頁),希望對大家有所幫助:https://qr21.cn/FV7h05

《鴻蒙 (Harmony OS)開發學習手冊》

入門必看:https://qr21.cn/FV7h05

  1. 應用開發導讀(ArkTS)
  2. 應用開發導讀(Java)

HarmonyOS 概念:https://qr21.cn/FV7h05

  1. 系統定義
  2. 技術架構
  3. 技術特性
  4. 系統安全

如何快速入門:https://qr21.cn/FV7h05

  1. 基本概念
  2. 構建第一個ArkTS應用
  3. 構建第一個JS應用
  4. ……

開發基礎知識:https://qr21.cn/FV7h05

  1. 應用基礎知識
  2. 配置文件
  3. 應用數據管理
  4. 應用安全管理
  5. 應用隱私保護
  6. 三方應用調用管控機制
  7. 資源分類與訪問
  8. 學習ArkTS語言
  9. ……

基于ArkTS 開發:https://qr21.cn/FV7h05

  1. Ability開發
  2. UI開發
  3. 公共事件與通知
  4. 窗口管理
  5. 媒體
  6. 安全
  7. 網絡與鏈接
  8. 電話服務
  9. 數據管理
  10. 后臺任務(Background Task)管理
  11. 設備管理
  12. 設備使用信息統計
  13. DFX
  14. 國際化開發
  15. 折疊屏系列
  16. ……

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208498.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208498.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208498.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端知識筆記(三十七)———Django與Ajax

特點&#xff1a; 異步提交 局部刷新 例子&#xff1a;github注冊 動態獲取用戶名實時的跟后端確認并實時的展示到前端&#xff08;局部刷新&#xff09; 朝后端發送請求的方式 1.瀏覽器地址欄直接輸入url回車 -----》get請求 2.a標簽的href屬性 -----》get請求 3…

pcl-3 pcl結合opencv做svm分類(法向量特征數據)

后續使用了fpfh特征作為訓練數據&#xff0c;遇到了一些困難 首先是flann沖突&#xff0c;這個將opcv中的flann都改成了flann2就可以運行 后面在將得到的33特征值進行訓練的時候一直內存超限&#xff0c;傳輸的不太好&#xff0c;到現在還是不行&#xff0c;改了三天還是沒有改…

Flink 系列文章匯總索引

Flink 系列文章 一、Flink 專欄 本專欄系統介紹某一知識點&#xff0c;并輔以具體的示例進行說明。 本專欄的文章編號可能不是順序的&#xff0c;主要是因為寫的時候順序沒統一&#xff0c;但相關的文章又引入了&#xff0c;所以后面就沒有調整了&#xff0c;按照寫文章的順…

OpenCL學習筆記(三)手動編譯開發庫(win10+mingw64)

前言 有的小伙伴仍然在使用mingw編譯器&#xff0c;這時只能重新編譯opencl的sdk庫。本文檔簡單記錄下win10下&#xff0c;使用mingw11.20編譯的過程&#xff0c;有需要的小伙伴可以參考下 一、安裝所需軟件 1.安裝git&#xff0c;教程比較多&#xff0c;不再重復 2.安裝cm…

chrome安裝jsonview

寫在前面 通過jsonview可以實現&#xff0c;當http響應時application/json時直接在瀏覽器格式化顯示&#xff0c;增加可讀性。本文看下如何安裝該插件到chrome中。 1&#xff1a;安裝 首先在這里 下載插件包&#xff0c;然后解壓備用。接著在chrome按照如下步驟操作&#xf…

千鋒 Vue 詳細筆記整理

視頻筆記是根據B站 千鋒 濤哥 - SpringBootvue前后端分離項目《鋒迷商城》實戰課-完結版 進行整理的 筆記可上 gitee倉庫 自取 千鋒 Vue 筆記整理 一、vue 的簡介1.1 使用 JQuery 的復雜性問題1.2 VUE 簡介1.2.1 前端框架1.2.2 MVVM 二、 vue 入門使用2.1 vue 的引入2.2 入門案…

WPF(Windows Presentation Foundation)的 StatusBar控件

WPF&#xff08;Windows Presentation Foundation&#xff09;的 StatusBar 是一種用于顯示狀態欄的控件。狀態欄是用于向用戶提供應用程序的狀態信息或其他相關信息的區域。它通常位于應用程序窗口的底部&#xff0c;并提供一些常見的功能&#xff0c;如顯示進度、狀態文本、通…

[C#] 基于 yield 語句的迭代器邏輯懶執行

眾所周知, C# 可以通過 yield 語句來快速向 IEnumerator 或者 IEnumerable 類型的方法返回值返回一個元素. 但它還有另外一個特性, 就是其內部邏輯的懶執行. 每兩個 yield 語句之間的邏輯都是一個狀態, 只有在調用迭代器的 MoveNext 方法后, 才會執行下一個狀態的邏輯. 在文章中…

澤攸科技二維材料轉移臺的應用場景及優勢

隨著二維材料的廣泛研究和各種潛在應用的開發&#xff0c;對于二維材料樣品的精密操控與轉移的需求日益增加。特別是一些新型二維材料的制備和器件集成制備中&#xff0c;需要在顯微鏡下對樣品進行觀察與定位&#xff0c;并能夠在微米甚至納米量級上精確移動和轉移樣品。 傳統…

集簡云 x 零售企業丨快速集成有贊商城和微盛企微管家,實現私域運營自動化

客戶介紹 某公司是一家知名的飲料廠商&#xff0c;自1998年成立以來&#xff0c;一直致力于研發和生產各種熱門飲品&#xff0c;如果汁、碳酸飲料、礦泉水等。因其獨特的口感和健康的品質深受消費者的喜愛。企業擁有多個知名品牌&#xff0c;享有極高的品牌知名度和市場份額。該…

BGP綜合

1、使用PreVal策略&#xff0c;確保R4通過R2到達192.168.10.0/24。 2、使用AS_Path策略&#xff0c;確保R4迪過R3到達192.168.11.0/24。 3、配置MED策略&#xff0c;確保R4通過R3到達192.168.12.0/24。 4、使用Local Preference策略&#xff0c;確保R1通過R2到達192.168.1.0…

Mac電腦系統管理:iStat Menus中文 for Mac

iStat Menus是一款強大而靈活的系統監控工具&#xff0c;可以幫助Mac用戶實時監控和管理自己的電腦。它提供了豐富的系統狀態和性能指標&#xff0c;可自定義的菜單欄圖標以及歷史數據記錄功能&#xff0c;讓用戶能夠全面了解和掌握電腦的運行情況。 實時系統監控&#xff1a;i…

Django的Auth模塊

Auth模塊 我們在創建好一個Django項目后執行數據庫遷移命令會自動生成很多表 其中有auth_user等表 Django在啟動之后就可以直接訪問admin路由&#xff0c;需要輸入用戶名和密碼&#xff0c;數據參考的就是auth_user表&#xff0c;并且必須是管理員才能進入 依賴于a…

flink1.12.4消費kafka 報錯 The coordinator is not available

報錯 You should retry committing the latest consumed offsets. Caused by: org.apache.kafka.common.errors.CoordinatorNotAvailableException: The coordinator is not available. 但是任務還在正常跑. 開源bug [FLINK-28060] Kafka Commit on checkpointing fails rep…

12.8 作業 C++

使用手動連接&#xff0c;將登錄框中的取消按鈕使用qt4版本的連接到自定義的槽函數中&#xff0c;在自定義的槽函數中調用關閉函數 將登錄按鈕使用qt5版本的連接到自定義的槽函數中&#xff0c;在槽函數中判斷ui界面上輸入的賬號是否為"admin"&#xff0c;密碼是否為…

一篇文章熟練掌握 Axios

Axios是什么 Axios是一個基于Promise的網絡請求庫&#xff0c;作用于node.js和瀏覽器中。在服務端使用原生node.js http模塊&#xff0c;在客戶端使用XMLHttpRequest。是基于Promise對Ajax的封裝。 Axios的特性 從瀏覽器創建XMLHttpRequests從node.js創建http請求支持Promis…

基于OpenCV的人臉識別系統案例

基于OpenCV的人臉識別系統案例 人臉識別簡介代碼實現案例應用情況 下面將介紹如何使用Python和OpenCV庫構建一個簡單但強大的人臉識別系統。人臉識別是計算機視覺領域的一個重要應用&#xff0c;具有廣泛的實際用途&#xff0c;從安全門禁到娛樂應用。 人臉識別簡介 人臉識別是…

MySQL - 表達式With as 語句的使用及練習

目錄 8.1 WITH AS 的含義 8.2 WITH AS語法的基本結構如下&#xff1a; 8.3 練習題1 8.4 牛客練習題 8.1 WITH AS 的含義 WITH AS 語法是MySQL中的一種臨時結果集&#xff0c;它可以在SELECT、INSERT、UPDATE或DELETE語句中使用。通過使用WITH AS語句&#xff0c;可以將一個查…

量子芯片技術:未來的計算革命

量子芯片技術&#xff1a;未來的計算革命 一、引言 隨著科技的不斷發展&#xff0c;人類正在進入一個全新的技術時代&#xff0c;即量子時代。量子芯片技術作為這個時代的重要代表&#xff0c;正逐漸改變我們對計算和信息處理的理解。本文將深入探討量子芯片技術的基本原理、…

Navicat 技術指引 | 適用于 GaussDB 分布式的服務器對象的創建/設計

Navicat Premium&#xff08;16.3.3 Windows版或以上&#xff09;正式支持 GaussDB 分布式數據庫。GaussDB分布式模式更適合對系統可用性和數據處理能力要求較高的場景。Navicat 工具不僅提供可視化數據查看和編輯功能&#xff0c;還提供強大的高階功能&#xff08;如模型、結構…