エキスパート:アンドロイドアプリでHuaweiキット(CloudDB/リモートコンフィグ)とRxandroidとMVVMを使用して医師に相談

8111 ワード

概要
この記事では、私はHuawei CloudDBとリモートの設定の統合と一緒に医師相談デモアプリケーションを作成します.医師と相談する簡単なインターフェイスを提供します.ユーザーは、リモート設定を使用してアプリケーション構成を動的に変更できます.
クラウドサービス
クラウドDBは、デバイスクラウドとデバイス間のシームレスなデータ同期を可能にするデバイスクラウドシナジーデータベース製品であり、すぐにデバイスクラウドとマルチデバイスシナジーアプリケーションを開発支援するオフラインアプリケーションの操作をサポートします.
柔軟な同期モード
クラウドDBはキャッシュとローカルデータ同期モードをサポートします.キャッシュモードでは、デバイス上のデータはクラウド上のデータのサブセットです.永続的なキャッシュが許可されている場合、クエリ結果は自動的にデバイス上でキャッシュされます.ローカルモードでは、データがローカルに格納され、雲に同期していません.
強力なクエリ機能:
クラウドDBは様々な述語クエリメソッドをサポートします.複数のチェーンフィルタリング条件を使用して、返された結果をフィルター処理してソートし、返された結果セット内のオブジェクトの数を制限できます.キャッシュモードでは、クラウド上のクラウドDBゾーンまたはローカルデバイス上でデータを問い合わせることができます.ローカルモードでは、データはローカルデバイス上のクラウドDBゾーンから直接問い合わせる.
リアルタイムアップデート:
クラウドDBのキャッシュモードでは、必要に応じてデータを聞くことができますし、クラウドDBのデータ同期機能を使用して、デバイスと雲の間にリアルタイムで変更されたデータを更新します.
オフライン操作:
クラウドDBのキャッシュモードでは、永続キャッシュが許可されている場合、アプリケーションクエリは、デバイスがオフラインになった後に自動的にクラウドDBからローカルホストに変更されます.ローカルに修正されたすべてのデータは、デバイスがオンラインになった後、自動的にクラウドDBに同期されます.
スケーラビリティ
クラウドDBは、自動マルチ領域データレプリケーション、一貫性保証、原子バッチ操作、トランザクションサポートを含む強力なHuaweiクラウドインフラストラクチャ機能を提供します.
セキュリティレベル:
クラウドDBは、デバイスクラウドデータの完全な暗号化管理、アプリケーション、ユーザー、およびサービスによるトリプル認証、およびデータセキュリティを確保するためのロールベースのアクセス許可管理をサポートしています.
前提条件
1 . Huawei電話エミュ3.0以降.
2非Huawei電話アンドロイド4.4以降(APIレベル19以上).
3 .アンドロイドスタジオ.
4 appgalleryアカウント.
アプリケーションギャラリー統合プロセス
1 . AppGallery Connectポータルのプロジェクトにログインし、作成または選択します.
2 .プロジェクト設定に移動し、設定ファイルをダウンロードします.
3 .一般的な情報に移動し、データストレージの場所を提供します.
クラウドを有効にする
アプリ開発
1 .新規プロジェクトを作成します.
2 .プロジェクトgradleの設定
3 . app gradleを設定します.
4 . AndroidManifestを設定します.XML
XML UIを使用したアクティビティクラスの作成.
CloudDB
パッケージコム.HMSDoctorResourtデモ.クラウド
アンドロイド.コンテンツ.コンテキスト
アンドロイド.Utilログ
インポートCOM.フイワイアグコネクト.アグルーティングポリシー
インポートCOM.フイワイアグコネクト.AgConnectInstance ;
インポートCOM.フイワイアグコネクト.アグコネクション
インポートCOM.フイワイアグコネクト.Authアグコネクト
インポートCOM.フイワイアグコネクト.クラウド.データベース.アグコネクション
インポートCOM.フイワイアグコネクト.クラウド.データベース.ゾーン
インポートCOM.フイワイアグコネクト.クラウド.データベース.クラウド
インポートCOM.フイワイアグコネクト.クラウド.データベース.クラウド
インポートCOM.フイワイアグコネクト.クラウド.データベース.例外.AgConnectCloudbException ;
インポートCOM.フイワイHMFタスク.On FailUriRestester;
インポートCOM.フイワイHMFタスク.OnSuccessListener;
インポートCOM.フイワイHMFタスク.タスク
インポート.コンテンツ.値.タグ
パブリッククラスCloudDB {
private Context context;
private static CloudDB instance;

private AGConnectCloudDB mCloudDB;
private CloudDBZoneConfig mConfig;
private CloudDBZone mCloudDBZone;

private CloudDB(Context context) {
    this.context=context;
}

public static CloudDB getInstance(Context context) {
    if (instance==null)instance=new CloudDB(context);
    return instance;
}

public CloudDB initAGConnectCloudDB() {
    AGConnectCloudDB.initialize(context);
    return this;
}

public CloudDB createCloudDb(){

    AGConnectInstance instance = AGConnectInstance.buildInstance(new AGConnectOptionsBuilder().setRoutePolicy(AGCRoutePolicy.CHINA).build(mContext));
    mCloudDB = AGConnectCloudDB.getInstance(instance, AGConnectAuth.getInstance(instance));
    mCloudDB.createObjectType(ObjectTypeInfoHelper.getObjectTypeInfo());

    return this;
}

public void configCloudDb(){
    mConfig = new CloudDBZoneConfig("QuickStartDemo",
            CloudDBZoneConfig.CloudDBZoneSyncProperty.CLOUDDBZONE_CLOUD_CACHE,
            CloudDBZoneConfig.CloudDBZoneAccessProperty.CLOUDDBZONE_PUBLIC);
    mConfig.setPersistenceEnabled(true);
    Task<CloudDBZone> openDBZoneTask = mCloudDB.openCloudDBZone2(mConfig, true);
    openDBZoneTask.addOnSuccessListener(new OnSuccessListener<CloudDBZone>() {
        @Override
        public void onSuccess(CloudDBZone cloudDBZone) {
            Log.i(TAG, "open cloudDBZone success");
            mCloudDBZone = cloudDBZone;
            // Add subscription after opening cloudDBZone success
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(Exception e) {
            Log.w(TAG, "open cloudDBZone failed for " + e.getMessage());
        }
    });
}

public void upsertBookInfos(BookInfo bookInfo) {
    if (mCloudDBZone == null) {
        Log.w(TAG, "CloudDBZone is null, try re-open it");
        return;
    }
    Task<Integer> upsertTask = mCloudDBZone.executeUpsert(bookInfo);
    upsertTask.addOnSuccessListener(new OnSuccessListener<Integer>() {
        @Override
        public void onSuccess(Integer cloudDBZoneResult) {
            Log.i(TAG, "Upsert " + cloudDBZoneResult + " records");
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(Exception e) {
            mUiCallBack.updateUiOnError("Insert book info failed");
        }
    });
}

public void viewCloudDbData(){
    private OnSnapshotListener<BookInfo> mSnapshotListener = new OnSnapshotListener<BookInfo>() {
        @Override
        public void onSnapshot(CloudDBZoneSnapshot<BookInfo> cloudDBZoneSnapshot, AGConnectCloudDBException e) {
            if (e != null) {
                Log.w(TAG, "onSnapshot: " + e.getMessage());
                return;
            }
            CloudDBZoneObjectList<BookInfo> snapshotObjects = cloudDBZoneSnapshot.getSnapshotObjects();
            List<BookInfo> bookInfos = new ArrayList<>();
            try {
                if (snapshotObjects != null) {
                    while (snapshotObjects.hasNext()) {
                        BookInfo bookInfo = snapshotObjects.next();
                        bookInfos.add(bookInfo);
                        updateBookIndex(bookInfo);
                    }
                }
                mUiCallBack.onSubscribe(bookInfos);
            } catch (AGConnectCloudDBException snapshotException) {
                Log.w(TAG, "onSnapshot:(getObject) " + snapshotException.getMessage());
            } finally {
                cloudDBZoneSnapshot.release();
            }
        }
    };


}

public void addSubscription() {
    if (mCloudDBZone == null) {
        Log.w(TAG, "CloudDBZone is null, try re-open it");
        return;
    }

    try {
        CloudDBZoneQuery<BookInfo> snapshotQuery = CloudDBZoneQuery.where(BookInfo.class)
                .equalTo(BookEditFields.SHADOW_FLAG, true);
        mRegister = mCloudDBZone.subscribeSnapshot(snapshotQuery,
                CloudDBZoneQuery.CloudDBZoneQueryPolicy.POLICY_QUERY_FROM_CLOUD_ONLY, mSnapshotListener);
    } catch (AGConnectCloudDBException e) {
        Log.w(TAG, "subscribeSnapshot: " + e.getMessage());
    }
}

`
ビルド結果

ヒントとトリック
CloudBizMennapshotオブジェクトが解放されているかどうかを確認します.CloudBizMounnPopshotオブジェクトが解放されない場合、登録されているリスナはデータ変更通知を受け取ることができません.CloudBizMounnInshotオブジェクトが使用されるたびに、関連するリソースを解放するには、Release ()メソッドを明示的に呼び出す必要があります.
クラウドDBゾーンは削除される前に閉じられません.削除するクラウドDBゾーンを閉じることを確認します.すべてのクラウドDBゾーンハンドルが解放された後、クラウドDBゾーンを削除できます.クラウドDBゾーンを開くには、終了操作が必要です.
結論
この記事では、AndroidアプリケーションでHMS CloudDBとリモートコンフィグを統合する方法を学びました.完全にこの記事を読んだ後、ユーザーは簡単にCloudDBとリモート設定を実装することができます.
この記事を読んでくれてありがとう.あなたがそれが役に立つとわかるならば、この記事に好きで、コメントしてください.それは私にたくさん意味します.
参考文献
HMSリモート設定ドキュメント
https://developer.huawei.com/consumer/en/doc/development/AppGallery-connect-Guides/agc-remoteconfig-introduction-0000001055149778
クラウドDBドキュメント
https://developer.huawei.com/consumer/en/doc/development/AppGallery-connect-Guides/agc-clouddb-introduction-0000001054212760
HMSトレーニングビデオ
https://developer.huawei.com/consumer/en/training/