[[419727]] 詳細については、以下をご覧ください。 51CTOとHuaweiが共同で構築したHongmengテクノロジーコミュニティ https://harmonyos..com 導入分散データ サービス (DDS) は、アプリケーションに異なるデバイス間でデータベース データを分散する機能を提供します。分散データ インターフェイスを呼び出すことにより、アプリケーションはデータを分散データベースに保存します。分散データ サービスは、アカウント、アプリケーション、データベースの 3 つを組み合わせることで、異なるアプリケーションに属するデータを分離し、異なるアプリケーション間のデータが分散データ サービスを通じて相互にアクセスできないようにします。分散データ サービスは、信頼できる認証済みデバイス間のアプリケーション データの同期をサポートし、複数の端末デバイスで最終的に一貫したデータ アクセス エクスペリエンスをユーザーに提供します。 機能紹介今回、HarmonyOS の分散データ サービス機能により、一方では独自のアプリケーション インターフェイスでのデータのリアルタイム更新を実現できるようになりました。一方、異なるデバイス間でのデータのリアルタイム更新も実現できます。前提条件として、異なるデバイス間で分散データ サービスの同期機能を実現するには、同じ Huawei アカウントでログインし、同じアプリケーション パッケージ名を使用し、同じネットワーク上にある必要があります。両方のデバイスで同時に Bluetooth をオンにすることもできます。 開発ガイド1. config.json に権限を追加します。 - // 能力と同じディレクトリレベルに追加
- 「必要な権限」 : [
- {
- 「名前」 : 「ohos.permission.DISTRIBUTED_DATASYNC」
- }
- ]
2. MainAbilityに権限を追加する - @オーバーライド
- パブリックvoid onStart(インテント インテント) {
- super.onStart(インテント);
- super.setMainRoute(MainAbilitySlice.class.getName());
- // Abilityを実装するコードは、マルチデバイス共同アクセス権限を使用する必要があることを明示的に宣言します
- requestPermissionsFromUser(新しい文字列[]{
- "ohos.permission.DISTRIBUTED_DATASYNC" }, 0);
-
- }
3. 構成に従って分散データベース管理クラスインスタンス KvManager を構築し、分散データベースオブジェクト SingleKvStore を作成します。 - //データベースを初期化する
- // 初期パラメータコンテキスト: Context context = getApplicationContext(); storeId は、"testApp" のように自分で定義できる、文字列型の分散データベース ID です。
- 公共 静的SingleKvStore initOrGetDB(コンテキストコンテキスト、文字列ストアID) {
- KvManagerConfig kvManagerConfig = 新しい KvManagerConfig(コンテキスト);
- kvManager = KvManagerFactory.getInstance().createKvManager(kvManagerConfig);
- オプション options = new Options();
- オプション.setCreateIfMissing( true )
- .setEncrypt( false )
- .setKvStoreType(KvStoreType.SINGLE_VERSION) //データベース タイプ: 単一バージョンの分散データベース
- .setAutoSync( true ); //データを自動同期に設定する
- singleKvStore = kvManager.getKvStore(オプション, ストアID);
- singleKvStoreを返します。
- }
4. 単一バージョンの分散データベースにデータを書き込みます。 - //キーと値の形式で分散データベースに保存します
- 試す {
- 長いid = System.currentTimeMillis();
- singleKvStore.putString( "キー" ,
- "{\"id\":" + id +
- ",\"temp\":" + 温度 +
- 湿度+
- ",\"NH4\":" + 0.0 +
- ",\"H2S\":" + 0.0 +
- ",\"その他\":" + ガス + "}" );
- } キャッチ (KvStoreException e) {
- e.printStackTrace();
- }
5. 分散データの変更をサブスクライブします。クライアントは、データの変更を監視するために KvStoreObserver インターフェイスを実装する必要があります。 - 試す {
- //サブスクリプションタイプ SubscribeType.SUBSCRIBE_TYPE_ALL は、ローカルデバイスや他の周辺機器と同期できることを意味します
- 内部KvStoreObserver = 新しい内部KvStoreObserver();
- 単一の KvStore.subscribe(SubscribeType.SUBSCRIBE_TYPE_ALL、内部 KvStoreObserver);
- } キャッチ (KvStoreException e) {
- e.printStackTrace();
- }
-
- パブリッククラスInnerKvStoreObserverはKvStoreObserverを実装します{
-
- @オーバーライド
- パブリックvoid onChange(ChangeNotification changeNotification) {
- // ページ上のデータを更新します。落とし穴もあります。 onChange メソッドは実際には子スレッドで実行されます。
- メインアビリティスライス.taskDispatcher.asyncDispatch(() -> {
- //ここでページUIコンポーネントの表示更新を実行します
- UIData をフラッシュします。
- });
- }
- }
6. 分散データベースデータを取得する - プライベートvoid flushUIData() {
- // 分散データのデータを照会します。 get(String key )/getEntries(String key )メソッドでデータを取得できます。
- リスト<Entry> エントリ = singleKvStore.getEntries(" key ");
- エントリサイズ() > 0の場合{
- ZSONObject zsonObject = ZSONObject.stringToZSON(entries.get(0).getValue().getString());
- 整数 temp = zsonObject.getIntValue( "temp" );
- int湿度 = zsonObject.getIntValue( "湿度" );
- intその他 = zsonObject.getIntValue( "その他" );
- tvTemp.setText(温度+ "℃" );
- tvHumi.setText(湿度+ "%RH" );
- tvGas.setText(other+ "% LEL" );
- }
7. サブスクリプションのキャンセル。これは通常、ページが破棄されたときに呼び出されます。つまり、MainAbilitySliceのonStop()で呼び出されます。 - シングルKvStore != null の場合{
- 単一のKvStore。unSubscribe(内部KvStoreObserver);
- }
8. データを他のデバイスと同期します。接続されているデバイスのリストを取得し、同期方法を選択してデータを同期します - リスト<デバイス情報> deviceInfoList = kvManager.getConnectedDevicesInfo(DeviceFilterStrategy.NO_FILTER);
- リスト<String> deviceIdList = 新しいArrayList<>();
- (デバイス情報デバイス情報:デバイス情報リスト) {
- デバイスIDリストに追加します(デバイス情報を取得します)。
- }
- 単一のKvStore.sync(デバイスIDリスト、SyncMode.PUSH_ONLY);
このプロジェクトは、スケジュールされたタスクを使用してバックグラウンド サービスで開始し、分散データベースにデータをリアルタイムで保存し、メイン インターフェイスでデータの変更を監視してデータをリアルタイムで更新します。 結果1. 初期インストール完了後の効果:
2. 3秒ごとにインターフェースデータが変更されます。
ソースコードを添付します: 1.メインアビリティスライス - パブリッククラス MainAbilitySlice は AbilitySlice を拡張します {
- プライベート SingleKvStore シングルKvストア;
- プライベートテキストtvTemp;
- プライベートテキストtvHumi;
- プライベートテキストtvGas;
- プライベートインテント serviceIntent;
- プライベート InnerKvStoreObserver innerKvStoreObserver;
-
- @オーバーライド
- パブリックvoid onStart(インテント インテント) {
- super.onStart(インテント);
- UIContent をスーパーに設定します。
- tvTemp=(テキスト)findComponentById(ResourceTable.Id_tvTemp);
- tvHumi=(テキスト)findComponentById(ResourceTable.Id_tvHumi);
- tvGas=(テキスト)findComponentById(ResourceTable.Id_tvGas);
- サービスの初期化();
-
- 試す {
- //データベースを取得する
- 単一の KvStore を DBUtils.initOrGetDB(これ、 DBUtils.STORE_ID);
- 内部KvStoreObserver = 新しい内部KvStoreObserver();
- 単一の KvStore.subscribe(SubscribeType.SUBSCRIBE_TYPE_ALL、内部 KvStoreObserver);
- } キャッチ (KvStoreException e) {
- e.printStackTrace();
- }
- }
-
- パブリッククラスInnerKvStoreObserverはKvStoreObserverを実装します{
-
- @オーバーライド
- パブリックvoid onChange(ChangeNotification changeNotification) {
- // ページ上のデータを更新します。落とし穴もあります。 onChange メソッドは実際には子スレッドで実行されます。
- getUITaskDispatcher().asyncDispatch(() -> {
- //ここでページUIコンポーネントの表示更新を実行します
- UIData をフラッシュします。
- });
- }
- }
-
- プライベートvoid flushUIData() {
- //分散データのデータを照会する
- リスト<Entry> エントリ = singleKvStore.getEntries( "key" );
- エントリサイズ() > 0の場合{
- ZSONObject zsonObject = ZSONObject.stringToZSON(entries.get(0).getValue().getString());
- 整数 temp = zsonObject.getIntValue( "temp" );
- int湿度 = zsonObject.getIntValue( "湿度" );
- intその他 = zsonObject.getIntValue( "その他" );
- tvTemp.setText(温度+ "℃" );
- tvHumi.setText(湿度+ "%RH" );
- tvGas.setText(other+ "% LEL" );
- }
-
-
-
- }
-
- プライベートvoid initService() {
- //ServiceAbilityを開始する
- サービスインテント = 新しいインテント();
- 操作 operation = new Intent.OperationBuilder()
- .withDeviceId( "" )
- .withBundleName( "com.isoftstone.kvstoreapp" )
- .withAbilityName( "com.isoftstone.kvstoreapp.ServiceAbility" )
- 。建てる();
- serviceIntent.setOperation(操作);
- サービスインテントを開始します。
- }
-
- @オーバーライド
- パブリックvoid onActive() {
- スーパーのonActive();
- }
-
- @オーバーライド
- パブリックvoid onForeground(インテント インテント) {
- super.onForeground(インテント);
- }
-
- @オーバーライド
- 保護されたvoid onStop() {
- スーパーのonStop();
- //サービスを破棄する
- サービスインテントを停止します。
- //データベースを削除する
- DBUtils.clearDB();
- // 登録解除
- シングルKvStore != null の場合{
- 単一のKvStore。unSubscribe(内部KvStoreObserver);
- }
- }
- }
2. 保守性 - パブリッククラスServiceAbilityはAbilityを拡張します{
-
- プライベート静的最終 HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD001100, "デモ" );
- プライベート SingleKvStore シングルKvストア;
- プライベートタイマータイマー;
- プライベート MyTimerTask myTimerTask;
- プライベートint温度;
- プライベートint湿度;
- プライベートintガス;
-
- @オーバーライド
- パブリックvoid onStart(インテント インテント) {
- super.onStart(インテント);
- 単一の KvStore を DBUtils.initOrGetDB(これ、 DBUtils.STORE_ID);
- タイマー = 新しいタイマー();
- myTimerTask = 新しい MyTimerTask();
- タイマーをスケジュールします(myTimerTask,0,3000);
-
- }
-
- @オーバーライド
- パブリックvoid onBackground() {
- スーパーのonBackground();
- HiLog.info(LABEL_LOG、 "ServiceAbility::onBackground" );
- }
-
- @オーバーライド
- パブリックボイドonStop() {
- スーパーのonStop();
- myTimerTask がnullの場合
- キャンセル
- }
- if (タイマー! = null ) {
- タイマーをキャンセルします。
- }
- }
-
- @オーバーライド
- パブリックvoid onCommand(インテント インテント、ブール値 再起動、 int開始 ID) {
- }
-
- @オーバーライド
- パブリックIRemoteObject onConnect(インテントインテント) {
- 戻る ヌル;
- }
-
- @オーバーライド
- パブリックvoid onDisconnect(インテント インテント) {
- }
-
- プライベートクラスMyTimerTaskはTimerTaskを拡張します{
-
- @オーバーライド
- パブリックボイド実行(){
- 温度++;
- 湿度++;
- ガス++;
- 試す {
- 長いid = System.currentTimeMillis();
- singleKvStore.putString( "キー" ,
- "{\"id\":" + id +
- ",\"temp\":" + 温度 +
- 湿度+
- ",\"NH4\":" + 0.0 +
- ",\"H2S\":" + 0.0 +
- ",\"その他\":" + ガス + "}" );
- } キャッチ (KvStoreException e) {
- e.printStackTrace();
- }
-
- }
- }
- }
3.DBユーティリティ - パブリッククラスDBUtils {
- //分散データベースのストアID
- 公共 静的最終文字列 STORE_ID = "kvStoreDB" ;
- プライベート静的KvManager kvManager;
- プライベート静的SingleKvStore singleKvStore;
-
-
- //データベース初期化の具体的な実装
- 公共 静的SingleKvStore initOrGetDB(コンテキストコンテキスト、文字列ストアID) {
-
- KvManagerConfig kvManagerConfig = 新しい KvManagerConfig(コンテキスト);
- kvManager = KvManagerFactory.getInstance().createKvManager(kvManagerConfig);
- オプション options = new Options();
- オプション.setCreateIfMissing( true )
- .setEncrypt( false )
- .setKvStoreType(KvStoreType.SINGLE_VERSION)
- .setAutoSync( true ); //データを自動同期に設定する
- singleKvStore = kvManager.getKvStore(オプション, ストアID);
- singleKvStoreを返します。
- }
-
- // データベース内のフィールドが変更された場合、変更を有効にするには閉じて削除し、再作成する必要があります。
- 公共 静的void clearDB() {
- kvManager.closeKvStore(単一のKvStore);
- kvManager.deleteKvStore(STORE_ID);
- }
-
-
- }
4. メインアビリティ - パブリッククラスMainAbilityはAbilityを拡張します{
-
- @オーバーライド
- パブリックvoid onStart(インテント インテント) {
- super.onStart(インテント);
- super.setMainRoute(MainAbilitySlice.class.getName());
- // Abilityを実装するコードは、マルチデバイス共同アクセス権限を使用する必要があることを明示的に宣言します
- requestPermissionsFromUser(新しい文字列[]{
- "ohos.permission.DISTRIBUTED_DATASYNC" }, 0);
- }
- }
5. マイアプリケーション - パブリッククラスMyApplicationはAbilityPackageを拡張します{
-
- @オーバーライド
- パブリックvoid onInitialize() {
- スーパーのonInitialize();
- }
- }
6. config.json ファイル - {
- "アプリ" : {
- "バンドル名" : "com.isoftstone.healthdata" ,
- 「ベンダー」 : 「isoftstone」 、
- 「バージョン」 : {
- 「コード」 : 1000000,
- "名前" : "1.0"
- },
- 「apiバージョン」 : {
- 「互換性」 : 4,
- 「ターゲット」 : 5,
- "releaseType" : "リリース"
- }
- },
- "デバイス構成" : {},
- 「モジュール」 : {
- 「パッケージ」 : 「com.isoftstone.kvstoreapp」 、
- 「名前」 : 「.MyApplication」 、
- "デバイスタイプ" : [
- "電話"
- ]、
- 「ディストリビューション」 : {
- "インストール時に配信" : true 、
- "モジュール名" : "エントリ" ,
- "モジュールタイプ" : "エントリ"
- },
- 「必要な権限」 : [
- {
- 「名前」 : 「ohos.permission.DISTRIBUTED_DATASYNC」
- }
- ]、
- 「能力」 : [
- {
- 「スキル」 : [
- {
- 「エンティティ」 : [
- 「エンティティ.システム.ホーム」
- ]、
- 「アクション」 : [
- 「アクション.システム.ホーム」
- ]
- }
- ]、
- 「方向」 : 「未指定」 、
- 「名前」 : 「com.isoftstone.kvstoreapp.MainAbility」 、
- "アイコン" : "$media:icon" ,
- "説明" : "$string:mainability_description" ,
- "ラベル" : "$文字列:app_name" ,
- 「タイプ」 : 「ページ」 、
- 「起動タイプ」 : 「標準」
- },
- {
- 「名前」 : 「com.isoftstone.kvstoreapp.ServiceAbility」 、
- "アイコン" : "$media:icon" ,
- 「説明」 : 「$string:serviceability_description」 、
- 「タイプ」 : 「サービス」
- }
- ]
- }
- }
7.xmlレイアウトファイル - <?xml バージョン = "1.0"エンコーディング = "utf-8" ?>
- <方向レイアウト
- xmlns:ohos= "http://schemas.huawei.com/res/ohos"
- ohos:height= "match_parent"
- ohos:orientation= "垂直"
- ohos:width= "match_parent" >
-
- <方向レイアウト
- ohos:padding= "20vp"
- ohos:height= "match_content"
- ohos:width= "match_parent"
- ohos:orientation= "水平" >
- <テキスト
- ohos:width= "match_content"
- ohos:height= "match_content"
- ohos:text_size= "20vp"
- ohos:text= "温度:" />
- <テキスト
- ohos:id= "$+id:tvTemp"
- ohos:幅= "0"
- ohos:height= "match_content"
- ohos:text_size= "22vp"
- ohos:text_color= "#00ff00"
- ohos:text= "収集予定..."
- ohos:weight= "1" />
- </方向レイアウト>
- <方向レイアウト
- ohos:height= "1vp"
- ohos:width= "match_parent"
- ohos:background_element= "#cccccc" />
-
- <方向レイアウト
- ohos:padding= "20vp"
- ohos:height= "match_content"
- ohos:width= "match_parent"
- ohos:orientation= "水平" >
- <テキスト
- ohos:width= "match_content"
- ohos:height= "match_content"
- ohos:text_size= "20vp"
- ohos:text= "湿度:" />
- <テキスト
- ohos:id= "$+id:tvHumi"
- ohos:幅= "0"
- ohos:height= "match_content"
- ohos:text_size= "22vp"
- ohos:text_color= "#00ff00"
- ohos:text= "収集予定..."
- ohos:weight= "1" />
- </方向レイアウト>
- <方向レイアウト
- ohos:height= "1vp"
- ohos:width= "match_parent"
- ohos:background_element= "#cccccc" />
-
-
- <方向レイアウト
- ohos:padding= "20vp"
- ohos:height= "match_content"
- ohos:width= "match_parent"
- ohos:orientation= "水平" >
- <テキスト
- ohos:width= "match_content"
- ohos:height= "match_content"
- ohos:text_size= "20vp"
- ohos:text= "可燃性ガス:" />
- <テキスト
- ohos:id= "$+id:tvGas"
- ohos:幅= "0"
- ohos:height= "match_content"
- ohos:text_size= "22vp"
- ohos:text_color= "#00ff00"
- ohos:text= "収集予定..."
- ohos:weight= "1" />
- </方向レイアウト>
- <方向レイアウト
- ohos:height= "1vp"
- ohos:width= "match_parent"
- ohos:background_element= "#cccccc" />
-
- </方向レイアウト>
詳細については、以下をご覧ください。 51CTOとHuaweiが共同で構築したHongmengテクノロジーコミュニティ https://harmonyos..com |