OpenHarmony標準設備應用開發(三)——分散式數據管理

来源:https://www.cnblogs.com/openharmony/archive/2022/04/07/16113913.html
-Advertisement-
Play Games

為了更好的理解,我們使用 eTS 開發了一款如下動圖所示的井字過三關游戲來講解分散式數據管理在應用中的使用。 ...


(以下內容來自開發者分享,不代表 OpenHarmony 項目群工作委員會觀點)

 

邢碌

上一章,我們通過分散式音樂播放器、分散式炸彈、分散式購物車,帶大家講解了 OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)中,相關控制項在佈局中如何使用,以及在 OpenHarmony 中如何實現音樂播放,顯示動畫,轉場動畫(頁面間轉場)等功能。

 

本章是 OpenHarmony 標準設備應用開發的第三篇文章,將會在前面兩章的基礎上給大家講解分散式數據管理在多台設備間,當數據出現變動時,通過訂閱的方式,實現多台設備間的數據同步更新。為了更好的理解,我們使用 eTS 開發了一款如下動圖所示的井字過三關游戲來講解分散式數據管理在應用中的使用。

 

Demo 簡介:Demo 基於 OpenHarmony 系統使用 eTS 語言進行編寫,本 Demo 主要通過設備認證,分散式拉起,分散式數據管理等功能來實現。

 

 

項目創建以及頁面佈局等,這裡就不再贅述,本章重點講解自定義彈窗以及分散式數據管理。

 

一、自定義彈窗


通過對自定義彈窗的講解,希望能讓大家學到如何在項目中實現自己的自定義彈窗。

 

1.1 通過 @CustomDialog 裝飾器來創建自定義彈窗,使用方式可參考 自定義彈窗:

 

官方參考鏈接:https://gitee.com/openharmony/docs/blob/OpenHarmony-3.1-Beta/zh-cn/application-dev/reference/arkui-ts/ts-methods-custom-dialog-box.md


1.2 佈局從上到下由 Text、List、Button 組成,List 中的子元素由 Text 和 Radio 組成,以下代碼的省略號表示非 UI 相關的邏輯代碼,具體實現參考源代碼:

 

 
@CustomDialog
struct gameStart {
  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
        //頂部標題
        Text('發現以下線上設備').fontColor(Color.Black).fontSize(30)
      }.width('100%').height('20%')

      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) {
       //使用List容器動態載入線上設備
       List() {
          ForEach(this.deviceName, (item) => {
            ListItem() {
              Row() {
                //Text組件顯示設備名
                Text(item.deviceName).width('80%').fontSize(30).fontColor(Color.Black)
                //Radio組件顯示單選框
                Radio({ value: '' }).checked(this.check[item.id]).onChange(() => {
                  //這裡保證List裡面點擊了多個Radio組件時,只有當前點擊的為選中狀態
                  for (let i = 0; i < this.check.length; i++) {
                    this.check[i] = false
                  }
                  this.check[item.id] = true
                })
              }
            }
          }, item => item.id)
        }
        .height('80%')

        Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
          Button('確定').width(200).height(50).fontSize(30).onClick(() => {
            //......
            this.controller.close()
          })
        }.height('30%')

      }.width('100%').height('80%')
    }.height('100%').width('100%')
  }
}


通過上述方式,完成我們的自定義彈窗,大家也可以在自己的項目中嘗試完成自己的自定義彈窗。

 

二、分散式數據管理


分散式數據管理,可以在多台設備間,當數據出現變動時,通過訂閱的方式,實現多台設備間的數據同步更新。當我們需要在多台設備間實現數據的同步更新,就可以使用分散式數據管理來實現。井字過三關游戲,通過分散式數據管理,實現多台設備間游戲界面的同步更新,實現多台設備同玩一個游戲的功能。

 

官網參考鏈接:https://gitee.com/openharmony/docs/blob/OpenHarmony-3.1-Beta/zh-cn/application-dev/reference/apis/js-apis-distributed-data.md


數據分散式運作示意圖,如下所示。

 

 

實現步驟:

 

分散式數據管理依賴 @ohos.data.distributedData 模塊實現,詳細參考項目源碼中的 RemoteDataManager.ets 實現步驟。

 

2.1 導入該模塊

 

import factory from '@ohos.data.distributedData';

 

2.2 創建 KVManager 實例,用於管理資料庫對象

 

registerDataListCallback(callback) {
    let that = this
    if (this.kvManager == null) {
      try {
        const config = {
          userInfo: {
            userId: '0',
            userType: 0
          },
          bundleName: 'com.example.tictactoegame'
        }
        factory.createKVManager(config).then((manager) => {
          that.kvManager = manager
          that.registerDataListCallback_(callback)
        }).catch((err) => {
        })
      } catch (e) {
      }
    } else {
      this.registerDataListCallback_(callback)
    }
  }


備註:bundleName 改成對應內容

 

2.3 創建並獲取 KVStore 資料庫

 

registerDataListCallback_(callback) {
    let that = this
    if (that.kvManager == null) {
      callback()
      return
    }
    if (that.kvStore == null) {
      try {
        let options =
          {
            createIfMissing: true,
            encrypt: false,
            backup: false,
            autoSync: true,
            kvStoreType: 1,
            securityLevel: 3
          }
        this.kvManager.getKVStore(this.STORE_ID, options).then((store) => {
          that.kvStore = store
          that._registerDataListCallback_(callback)
        }).catch((err) => {
        })
      } catch (e) {
      }
    } else {
      this._registerDataListCallback_(callback)
    }
  }


備註:STORE_ID 改成對應內容

 

2.4 訂閱指定類型的數據變更通知

 

_registerDataListCallback_(callback) {
    let that = this
    if (that.kvManager == null) {
      callback()
      return
    }
    this.kvStore.on('dataChange', 1, function(data) {
      if (data) {
         that.arr = data.updateEntries
        callback()
      }
    })
  }


備註:kvStore.on 方法中的 1 對應訂閱的類型,具體詳情看上面官網參考中的詳細描述。

 

2.5 添加指定類型鍵值對到資料庫

 

dataChange(key, value) {
    let that = this
      try {
        that.kvStore.put(JSON.stringify(key), JSON.stringify(value)).then((data) => {
        }).catch((err) => {
          prompt.showToast({message:'put err:'+JSON.stringify(value)})
        })

      } catch (e) {
      }
  }


項目下載鏈接:https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/FA/Entertainment/TicTacToeGame


相關問題說明:

分散式數據管理數據傳輸過程中,如果數據中包含中文,會出現亂碼,所以數據存儲中,儘量不要使用中文。

 

通過此次三個章節的講解,我們知道瞭如何從零到有在標準設備上運行一個最簡單的 OpenHarmony 程式,併在此基礎上,知道瞭如何在 OpenHarmony 中做到音樂播放,顯示動畫,轉場動畫等相關進階技能,以及如何通過分散式數據管理在多台設備之間實現數據的同步更新。

 

在後續 OpenHarmony 最新版本中,我們會有更多新的特性,更多的開發板,以及更多的樣例帶給大家,敬請期待。

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 2022年第一場Blazor中文社區的開發者分享活動,我們的團隊也全程參與其中,在議程中,也分享了我們團隊的Blazor 管理後臺模板,針對於Blazor,先科普一波,避免有些朋友不瞭解,Blazor是微軟推出的基於.NET的前端技術。利用現有的.NET生態,受於.NET的性能,可靠性和安全性,不僅 ...
  • 通常,PDF格式的文檔能支持的編輯功能不如office文檔多,針對PDF文檔裡面有表格數據的,如果想要編輯表格裡面的數據,可以將該PDF文檔轉為Excel格式,然後編輯。本文,將以C#代碼為例,介紹如何實現由PDF格式到Excel文檔格式的轉換。下麵是具體步驟。 【dll引用方法】 方法1 在程式中 ...
  • 一、原子操作 先看一段問題代碼 /// <summary> /// 獲取自增 /// </summary> public static void GetIncrement() { long result = 0; Console.WriteLine("開始計算"); //10個併發執行 Parall ...
  • 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是i.MXRT1170下單獨線上調試從核工程的方法(基於IAR)。 兩年前痞子衡寫過一篇《雙核i.MXRT1170之Cortex-M7與Cortex-M4互相激活之道》,那篇文章從離線啟動的角度介紹了跑雙核應用的基本方法,基本上把雙核啟動 ...
  • 一、調用系統的IsDebuggerPresent函數 (1)實現程式 最簡單也是最基礎的,Windows提供的API介面:IsDebuggerPresent(),這API實際上就是訪問PEB的BeingDebugged標誌來判斷是否處於調試狀態。 使用vs調試此段代碼,彈出"檢測到調試器"。 #in ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 OneBlog是什麼? OneBlog,一個簡潔美觀、功能強大並且自適應的Java博客。使用springboot開發,前端使用Bootstrap。支持移動端自適應,配有完備的前臺和後臺管理功能。 簡單瞭解了OneBlog後,下麵就跟隨博主一起看下 ...
  • 1.併發事務問題 1)臟讀:一個事物讀到另一個事務還沒有提交的數據。 2)不可重覆讀:一個事務先後讀取同一條記錄,但兩次讀取的數據不同,稱之為不可重覆讀。 3)幻讀:一個事務按照條件查詢數據時,沒有對應的數據行,但是在插入數據時,又發現這行數據已經存在,好像出現了“幻影”。 2.事務隔離級別 隔離級 ...
  • 1. LOAD DATA INFILE 為什麼比 INSERT 快? 2. sysbench 壓測 MySQL 的四個標準步驟。 3. 怎麼讓 sysbench 支持 LOAD DATA LOCAL INFILE 命令,讓導數速度提升 30%? ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...