HarmonyOS基本技術により実現した分散データサービス機能

HarmonyOS基本技術により実現した分散データサービス機能

[[419727]]

詳細については、以下をご覧ください。

51CTOとHuaweiが共同で構築したHongmengテクノロジーコミュニティ

https://harmonyos..com

導入

分散データ サービス (DDS) は、アプリケーションに異なるデバイス間でデータベース データを分散する機能を提供します。分散データ インターフェイスを呼び出すことにより、アプリケーションはデータを分散データベースに保存します。分散データ サービスは、アカウント、アプリケーション、データベースの 3 つを組み合わせることで、異なるアプリケーションに属するデータを分離し、異なるアプリケーション間のデータが分散データ サービスを通じて相互にアクセスできないようにします。分散データ サービスは、信頼できる認証済みデバイス間のアプリケーション データの同期をサポートし、複数の端末デバイスで最終的に一貫したデータ アクセス エクスペリエンスをユーザーに提供します。

機能紹介

今回、HarmonyOS の分散データ サービス機能により、一方では独自のアプリケーション インターフェイスでのデータのリアルタイム更新を実現できるようになりました。一方、異なるデバイス間でのデータのリアルタイム更新も実現できます。前提条件として、異なるデバイス間で分散データ サービスの同期機能を実現するには、同じ Huawei アカウントでログインし、同じアプリケーション パッケージ名を使用し、同じネットワーク上にある必要があります。両方のデバイスで同時に Bluetooth をオンにすることもできます。

開発ガイド

1. config.json に権限を追加します。

  1. // 能力と同じディレクトリレベルに追加
  2. 「必要な権限」 : [
  3. {
  4. 「名前」 : 「ohos.permission.DISTRIBUTED_DATASYNC」  
  5. }
  6. ]

2. MainAbilityに権限を追加する

  1. @オーバーライド
  2. パブリックvoid onStart(インテント インテント) {
  3. super.onStart(インテント);
  4. super.setMainRoute(MainAbilitySlice.class.getName());
  5. // Abilityを実装するコードは、マルチデバイス共同アクセス権限を使用する必要があることを明示的に宣言します
  6. requestPermissionsFromUser(新しい文字列[]{
  7. "ohos.permission.DISTRIBUTED_DATASYNC" }, 0);
  8.  
  9. }

3. 構成に従って分散データベース管理クラスインスタンス KvManager を構築し、分散データベースオブジェクト SingleKvStore を作成します。

  1. //データベースを初期化する
  2. // 初期パラメータコンテキスト: Context context = getApplicationContext(); storeId は、"testApp" のように自分で定義できる、文字列型の分散データベース ID です。
  3. 公共 静的SingleKvStore initOrGetDB(コンテキストコンテキスト、文字列ストアID) {
  4. KvManagerConfig kvManagerConfig = 新しい KvManagerConfig(コンテキスト);
  5. kvManager = KvManagerFactory.getInstance().createKvManager(kvManagerConfig);
  6. オプション options = new Options();
  7. オプション.setCreateIfMissing( true )
  8. .setEncrypt( false )
  9. .setKvStoreType(KvStoreType.SINGLE_VERSION) //データベース タイプ: 単一バージョンの分散データベース
  10. .setAutoSync( true ); //データを自動同期に設定する
  11. singleKvStore = kvManager.getKvStore(オプション, ストアID);
  12. singleKvStoreを返します
  13. }

4. 単一バージョンの分散データベースにデータを書き込みます。

  1. //キーと値の形式で分散データベースに保存します
  2. 試す {
  3. 長いid = System.currentTimeMillis();
  4. singleKvStore.putString( "キー" ,
  5. "{\"id\":" + id +
  6. ",\"temp\":" + 温度 +
  7. 湿度+
  8. ",\"NH4\":" + 0.0 +
  9. ",\"H2S\":" + 0.0 +
  10. ",\"その他\":" + ガス + "}" );
  11. } キャッチ (KvStoreException e) {
  12. e.printStackTrace();
  13. }

5. 分散データの変更をサブスクライブします。クライアントは、データの変更を監視するために KvStoreObserver インターフェイスを実装する必要があります。

  1. 試す {
  2. //サブスクリプションタイプ SubscribeType.SUBSCRIBE_TYPE_ALL は、ローカルデバイスや他の周辺機器と同期できることを意味します
  3. 内部KvStoreObserver = 新しい内部KvStoreObserver();
  4. 単一の KvStore.subscribe(SubscribeType.SUBSCRIBE_TYPE_ALL、内部 KvStoreObserver);
  5. } キャッチ (KvStoreException e) {
  6. e.printStackTrace();
  7. }
  8.  
  9. パブリッククラスInnerKvStoreObserverはKvStoreObserverを実装します{
  10.  
  11. @オーバーライド
  12. パブリックvoid onChange(ChangeNotification changeNotification) {
  13. // ページ上のデータを更新します。落とし穴もあります。 onChange メソッドは実際には子スレッドで実行されます。
  14. メインアビリティスライス.taskDispatcher.asyncDispatch(() -> {
  15. //ここでページUIコンポーネントの表示更新を実行します
  16. UIData をフラッシュします。
  17. });
  18. }
  19. }

6. 分散データベースデータを取得する

  1. プライベートvoid flushUIData() {
  2. // 分散データのデータを照会します。 get(String key )/getEntries(String key )メソッドでデータを取得できます。
  3. リスト<Entry> エントリ = singleKvStore.getEntries(" key ");
  4. エントリサイズ() > 0の場合{
  5. ZSONObject zsonObject = ZSONObject.stringToZSON(entries.get(0).getValue().getString());
  6. 整数  temp = zsonObject.getIntValue( "temp" );
  7. int湿度 = zsonObject.getIntValue( "湿度" );
  8. intその他 = zsonObject.getIntValue( "その他" );
  9. tvTemp.setText(温度+ "℃" );
  10. tvHumi.setText(湿度+ "%RH" );
  11. tvGas.setText(other+ "% LEL" );
  12. }

7. サブスクリプションのキャンセル。これは通常、ページが破棄されたときに呼び出されます。つまり、MainAbilitySliceのonStop()で呼び出されます。

  1. シングルKvStore != null の場合{
  2. 単一のKvStore。unSubscribe(内部KvStoreObserver);
  3. }

8. データを他のデバイスと同期します。接続されているデバイスのリストを取得し、同期方法を選択してデータを同期します

  1. リスト<デバイス情報> deviceInfoList = kvManager.getConnectedDevicesInfo(DeviceFilterStrategy.NO_FILTER);
  2. リスト<String> deviceIdList = 新しいArrayList<>();
  3. (デバイス情報デバイス情報:デバイス情報リスト) {
  4. デバイスIDリストに追加します(デバイス情報を取得します)。
  5. }
  6. 単一のKvStore.sync(デバイスIDリスト、SyncMode.PUSH_ONLY);

このプロジェクトは、スケジュールされたタスクを使用してバックグラウンド サービスで開始し、分散データベースにデータをリアルタイムで保存し、メイン インターフェイスでデータの変更を監視してデータをリアルタイムで更新します。

結果

1. 初期インストール完了後の効果:


2. 3秒ごとにインターフェースデータが変更されます。



ソースコードを添付します:

1.メインアビリティスライス

  1. パブリッククラス MainAbilitySlice は AbilitySlice を拡張します {
  2. プライベート SingleKvStore シングルKvストア;
  3. プライベートテキストtvTemp;
  4. プライベートテキストtvHumi;
  5. プライベートテキストtvGas;
  6. プライベートインテント serviceIntent;
  7. プライベート InnerKvStoreObserver innerKvStoreObserver;
  8.  
  9. @オーバーライド
  10. パブリックvoid onStart(インテント インテント) {
  11. super.onStart(インテント);
  12. UIContent をスーパーに設定します。
  13. tvTemp=(テキスト)findComponentById(ResourceTable.Id_tvTemp);
  14. tvHumi=(テキスト)findComponentById(ResourceTable.Id_tvHumi);
  15. tvGas=(テキスト)findComponentById(ResourceTable.Id_tvGas);
  16. サービスの初期化();
  17.  
  18. 試す {
  19. //データベースを取得する
  20. 単一の KvStore を DBUtils.initOrGetDB(これ、 DBUtils.STORE_ID);
  21. 内部KvStoreObserver = 新しい内部KvStoreObserver();
  22. 単一の KvStore.subscribe(SubscribeType.SUBSCRIBE_TYPE_ALL、内部 KvStoreObserver);
  23. } キャッチ (KvStoreException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27.  
  28. パブリッククラスInnerKvStoreObserverはKvStoreObserverを実装します{
  29.  
  30. @オーバーライド
  31. パブリックvoid onChange(ChangeNotification changeNotification) {
  32. // ページ上のデータを更新します。落とし穴もあります。 onChange メソッドは実際には子スレッドで実行されます。
  33. getUITaskDispatcher().asyncDispatch(() -> {
  34. //ここでページUIコンポーネントの表示更新を実行します
  35. UIData をフラッシュします。
  36. });
  37. }
  38. }
  39.  
  40. プライベートvoid flushUIData() {
  41. //分散データのデータを照会する
  42. リスト<Entry> エントリ = singleKvStore.getEntries( "key" );
  43. エントリサイズ() > 0の場合{
  44. ZSONObject zsonObject = ZSONObject.stringToZSON(entries.get(0).getValue().getString());
  45. 整数  temp = zsonObject.getIntValue( "temp" );
  46. int湿度 = zsonObject.getIntValue( "湿度" );
  47. intその他 = zsonObject.getIntValue( "その他" );
  48. tvTemp.setText(温度+ "℃" );
  49. tvHumi.setText(湿度+ "%RH" );
  50. tvGas.setText(other+ "% LEL" );
  51. }
  52.  
  53.  
  54.  
  55. }
  56.  
  57. プライベートvoid initService() {
  58. //ServiceAbilityを開始する
  59. サービスインテント = 新しいインテント();
  60. 操作 operation = new Intent.OperationBuilder()
  61. .withDeviceId( "" )
  62. .withBundleName( "com.isoftstone.kvstoreapp" )
  63. .withAbilityName( "com.isoftstone.kvstoreapp.ServiceAbility" )
  64. 。建てる();
  65. serviceIntent.setOperation(操作);
  66. サービスインテントを開始します。
  67. }
  68.  
  69. @オーバーライド
  70. パブリックvoid onActive() {
  71. スーパーのonActive();
  72. }
  73.  
  74. @オーバーライド
  75. パブリックvoid onForeground(インテント インテント) {
  76. super.onForeground(インテント);
  77. }
  78.  
  79. @オーバーライド
  80. 保護されたvoid onStop() {
  81. スーパーのonStop();
  82. //サービスを破棄する
  83. サービスインテントを停止します。
  84. //データベースを削除する
  85. DBUtils.clearDB();
  86. // 登録解除
  87. シングルKvStore != null の場合{
  88. 単一のKvStore。unSubscribe(内部KvStoreObserver);
  89. }
  90. }
  91. }

2. 保守性

  1. パブリッククラスServiceAbilityはAbilityを拡張します{
  2.  
  3. プライベート静的最終 HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD001100, "デモ" );
  4. プライベート SingleKvStore シングルKvストア;
  5. プライベートタイマータイマー;
  6. プライベート MyTimerTask myTimerTask;
  7. プライベートint温度;
  8. プライベートint湿度;
  9. プライベートintガス;
  10.  
  11. @オーバーライド
  12. パブリックvoid onStart(インテント インテント) {
  13. super.onStart(インテント);
  14. 単一の KvStore を DBUtils.initOrGetDB(これ、 DBUtils.STORE_ID);
  15. タイマー = 新しいタイマー();
  16. myTimerTask = 新しい MyTimerTask();
  17. タイマーをスケジュールします(myTimerTask,0,3000);
  18.  
  19. }
  20.  
  21. @オーバーライド
  22. パブリックvoid onBackground() {
  23. スーパーのonBackground();
  24. HiLog.info(LABEL_LOG、 "ServiceAbility::onBackground" );
  25. }
  26.  
  27. @オーバーライド
  28. パブリックボイドonStop() {
  29. スーパーのonStop();
  30. myTimerTask がnull場合
  31. キャンセル
  32. }
  33. if (タイマー! = null ) {
  34. タイマーをキャンセルします。
  35. }
  36. }
  37.  
  38. @オーバーライド
  39. パブリックvoid onCommand(インテント インテント、ブール値 再起動、 int開始 ID) {
  40. }
  41.  
  42. @オーバーライド
  43. パブリックIRemoteObject onConnect(インテントインテント) {
  44. 戻る ヌル;
  45. }
  46.  
  47. @オーバーライド
  48. パブリックvoid onDisconnect(インテント インテント) {
  49. }
  50.  
  51. プライベートクラスMyTimerTaskはTimerTaskを拡張します{
  52.  
  53. @オーバーライド
  54. パブリックボイド実行(){
  55. 温度++;
  56. 湿度++;
  57. ガス++;
  58. 試す {
  59. 長いid = System.currentTimeMillis();
  60. singleKvStore.putString( "キー" ,
  61. "{\"id\":" + id +
  62. ",\"temp\":" + 温度 +
  63. 湿度+
  64. ",\"NH4\":" + 0.0 +
  65. ",\"H2S\":" + 0.0 +
  66. ",\"その他\":" + ガス + "}" );
  67. } キャッチ (KvStoreException e) {
  68. e.printStackTrace();
  69. }
  70.  
  71. }
  72. }
  73. }

3.DBユーティリティ

  1. パブリッククラスDBUtils {
  2. //分散データベースのストアID
  3. 公共 静的最終文字列 STORE_ID = "kvStoreDB" ;
  4. プライベート静的KvManager kvManager;
  5. プライベート静的SingleKvStore singleKvStore;
  6.  
  7.  
  8. //データベース初期化の具体的な実装
  9. 公共 静的SingleKvStore initOrGetDB(コンテキストコンテキスト、文字列ストアID) {
  10.  
  11. KvManagerConfig kvManagerConfig = 新しい KvManagerConfig(コンテキスト);
  12. kvManager = KvManagerFactory.getInstance().createKvManager(kvManagerConfig);
  13. オプション options = new Options();
  14. オプション.setCreateIfMissing( true )
  15. .setEncrypt( false )
  16. .setKvStoreType(KvStoreType.SINGLE_VERSION)
  17. .setAutoSync( true ); //データを自動同期に設定する
  18. singleKvStore = kvManager.getKvStore(オプション, ストアID);
  19. singleKvStoreを返します
  20. }
  21.  
  22. // データベース内のフィールドが変更された場合、変更を有効にするには閉じて削除し、再作成する必要があります。
  23. 公共 静的void clearDB() {
  24. kvManager.closeKvStore(単一のKvStore);
  25. kvManager.deleteKvStore(STORE_ID);
  26. }
  27.  
  28.  
  29. }

4. メインアビリティ

  1. パブリッククラスMainAbilityはAbilityを拡張します{
  2.  
  3. @オーバーライド
  4. パブリックvoid onStart(インテント インテント) {
  5. super.onStart(インテント);
  6. super.setMainRoute(MainAbilitySlice.class.getName());
  7. // Abilityを実装するコードは、マルチデバイス共同アクセス権限を使用する必要があることを明示的に宣言します
  8. requestPermissionsFromUser(新しい文字列[]{
  9. "ohos.permission.DISTRIBUTED_DATASYNC" }, 0);
  10. }
  11. }

5. マイアプリケーション

  1. パブリッククラスMyApplicationはAbilityPackageを拡張します{
  2.  
  3. @オーバーライド
  4. パブリックvoid onInitialize() {
  5. スーパーのonInitialize();
  6. }
  7. }

6. config.json ファイル

  1. {
  2. "アプリ" : {
  3. "バンドル名" : "com.isoftstone.healthdata" ,
  4. 「ベンダー」 : 「isoftstone」
  5. 「バージョン」 : {
  6. 「コード」 : 1000000,
  7. "名前" : "1.0"  
  8. },
  9. 「apiバージョン」 : {
  10. 「互換性」 : 4,
  11. 「ターゲット」 : 5,
  12. "releaseType" : "リリース"  
  13. }
  14. },
  15. "デバイス構成" : {},
  16. 「モジュール」 : {
  17. 「パッケージ」 : 「com.isoftstone.kvstoreapp」
  18. 「名前」 : 「.MyApplication」
  19. "デバイスタイプ" : [
  20. "電話"  
  21. ]、
  22. 「ディストリビューション」 : {
  23. "インストール時に配信" : true
  24. "モジュール名" : "エントリ" ,
  25. "モジュールタイプ" : "エントリ"  
  26. },
  27. 「必要な権限」 : [
  28. {
  29. 「名前」 : 「ohos.permission.DISTRIBUTED_DATASYNC」  
  30. }
  31. ]、
  32. 「能力」 : [
  33. {
  34. 「スキル」 : [
  35. {
  36. 「エンティティ」 : [
  37. 「エンティティ.システム.ホーム」  
  38. ]、
  39. 「アクション」 : [
  40. 「アクション.システム.ホーム」  
  41. ]
  42. }
  43. ]、
  44. 「方向」 「未指定」
  45. 「名前」 : 「com.isoftstone.kvstoreapp.MainAbility」
  46. "アイコン" : "$media:icon" ,
  47. "説明" : "$string:mainability_description" ,
  48. "ラベル" : "$文字列:app_name" ,
  49. 「タイプ」 : 「ページ」
  50. 「起動タイプ」 : 「標準」  
  51. },
  52. {
  53. 「名前」 : 「com.isoftstone.kvstoreapp.ServiceAbility」
  54. "アイコン" : "$media:icon" ,
  55. 「説明」 : 「$string:serviceability_description」
  56. 「タイプ」 : 「サービス」  
  57. }
  58. ]
  59. }
  60. }

7.xmlレイアウトファイル

  1. <?xml バージョン = "1.0"エンコーディング = "utf-8" ?>
  2. <方向レイアウト
  3. xmlns:ohos= "http://schemas.huawei.com/res/ohos"  
  4. ohos:height= "match_parent"  
  5. ohos:orientation= "垂直"  
  6. ohos:width= "match_parent" >
  7.  
  8. <方向レイアウト
  9. ohos:padding= "20vp"  
  10. ohos:height= "match_content"  
  11. ohos:width= "match_parent"  
  12. ohos:orientation= "水平" >
  13. <テキスト
  14. ohos:width= "match_content"  
  15. ohos:height= "match_content"  
  16. ohos:text_size= "20vp"  
  17. ohos:text= "温度:" />
  18. <テキスト
  19. ohos:id= "$+id:tvTemp"  
  20. ohos:幅= "0"  
  21. ohos:height= "match_content"  
  22. ohos:text_size= "22vp"  
  23. ohos:text_color= "#00ff00"  
  24. ohos:text= "収集予定..."  
  25. ohos:weight= "1" />
  26. </方向レイアウト>
  27. <方向レイアウト
  28. ohos:height= "1vp"  
  29. ohos:width= "match_parent"  
  30. ohos:background_element= "#cccccc" />
  31.  
  32. <方向レイアウト
  33. ohos:padding= "20vp"  
  34. ohos:height= "match_content"  
  35. ohos:width= "match_parent"  
  36. ohos:orientation= "水平" >
  37. <テキスト
  38. ohos:width= "match_content"  
  39. ohos:height= "match_content"  
  40. ohos:text_size= "20vp"  
  41. ohos:text= "湿度:" />
  42. <テキスト
  43. ohos:id= "$+id:tvHumi"  
  44. ohos:幅= "0"  
  45. ohos:height= "match_content"  
  46. ohos:text_size= "22vp"  
  47. ohos:text_color= "#00ff00"  
  48. ohos:text= "収集予定..."  
  49. ohos:weight= "1" />
  50. </方向レイアウト>
  51. <方向レイアウト
  52. ohos:height= "1vp"  
  53. ohos:width= "match_parent"  
  54. ohos:background_element= "#cccccc" />
  55.  
  56.  
  57. <方向レイアウト
  58. ohos:padding= "20vp"  
  59. ohos:height= "match_content"  
  60. ohos:width= "match_parent"  
  61. ohos:orientation= "水平" >
  62. <テキスト
  63. ohos:width= "match_content"  
  64. ohos:height= "match_content"  
  65. ohos:text_size= "20vp"  
  66. ohos:text= "可燃性ガス:" />
  67. <テキスト
  68. ohos:id= "$+id:tvGas"  
  69. ohos:幅= "0"  
  70. ohos:height= "match_content"  
  71. ohos:text_size= "22vp"  
  72. ohos:text_color= "#00ff00"  
  73. ohos:text= "収集予定..."  
  74. ohos:weight= "1" />
  75. </方向レイアウト>
  76. <方向レイアウト
  77. ohos:height= "1vp"  
  78. ohos:width= "match_parent"  
  79. ohos:background_element= "#cccccc" />
  80.  
  81. </方向レイアウト>

詳細については、以下をご覧ください。

51CTOとHuaweiが共同で構築したHongmengテクノロジーコミュニティ

https://harmonyos..com

<<:  最初からKubernetes上でアプリケーションを構築すべき理由

>>:  3分レビュー! 2021年8月のクラウドコンピューティング分野の重要な動向を簡単に紹介します

推薦する

バンカー: webhostingbuzz 11周年記念 [25% オフ] / 仮想ホスト / リセラー / VPS

webhostingbuzz は 11 周年を記念して、全製品を 25% 割引でご提供します。この価...

Baiduによるウェブサイトブロック後の開発戦略

Baidu は、目の中にある砂粒さえも許さない封建領主のようなものです。もしあなたが Baidu の...

記事をきっかけにSEO研修について考える

今日、A5 の記事を読みました。SEO トレーニング市場の闇について書かれていました。怖いと思いまし...

centralhosts - XEN VPS の 80% オフ プロモーション (無料 Windows 付き)

Centralhostsは歴史が長いと言えますが、ワンマンだという意見もあります。本当かどうかは分か...

中国移動、実名登録のない携帯電話は停止されるという噂に反応

5月20日のInformation Timesの報道によると、あるネットユーザーがWeiboで、国の...

分散型データセンターの5つの利点

業界の専門家が、あらゆる規模の企業が分散データセンターを使用する必要性と、それがより優れたソフトウェ...

360buyの内部構造シリーズの詳細な説明

数日前、著者は「ウェブサイトアーキテクチャの観点からTaoxie.comのSEOをレイアウトする方法...

justhost: 新しい米国 VPS、20% オフ、月額 7 元、200M 帯域幅、無制限トラフィック

老舗ロシアのサーバープロバイダーである justhost.asia は、米国中部のダラスに新しいデー...

検索結果にコンテンツ ページではなくホームページが表示されるのはなぜですか?

検索について言えば、ロングテールワードが多くのサイトにとって常にトラフィックの主なソースであったこと...

Baiduの重みにおけるTaoxie.comとPaixie.comのカタログの違いに関する構造的議論

今日は8月10日です。実は今朝からTaoxie.comとPaixie.comを見てきました。なぜなら...

Techo Hubテクノロジーツアー北京駅がオープン、多くの専門家が「デジタル金融イノベーションと実践」の饗宴に参加

[51CTO.comからのオリジナル記事] 科学技術の急速な発展に伴い、ビッグデータ、クラウドコンピ...

経験談:データ分析におけるPVとSEOの密接な関係

ウェブサイトの最適化のプロセスでは、データ分析は不可欠であり、最も多くの時間を費やす作業でもあります...

トラフィックコンバージョンを促進する方法

ウェブサイトのコンバージョンは、SEOの最終目標です。ウェブサイトのコンバージョン率がなければ、トラ...

成功する個人ブログを作成する方法の詳細について説明します

個人ブログは、個人の表示プラットフォームです。ポイントツーポイント インターネットの発展に伴い、独自...

分散時代が到来しました。データの価値を高めるにはどうすればよいでしょうか?

近年、デジタル技術の発展により、クラウドコンピューティングは再び変革の時代を迎えています。特に202...