上文(【Codelabs挑戰賽示例講解1】核酸檢測結果認證查詢系統-認證登錄)實現了核酸檢測結果認證查詢系統的認證登錄部分的功能,認證登錄完成后,接下來便是要實現核酸檢測結果數據的導入與查詢功能。
雲數據庫是一款端雲協同的數據庫產品,提供端雲數據的協同管理、統一的數據模型和豐富的數據管理API接口等能力,完全可以滿足數據的查詢功能。
《Codelabs挑戰賽——零基礎搭建認證查詢系統》活動正在火熱進行中,分享作品有機會獲得華為freebuds pro無線耳機、華為手環6nfc版、聯盟背包等豐厚大禮,快來參與吧>>https://developer.huawei.com/consumer/cn/forum/topic/0202851788421280176?fid=0102822233052010012
集成SDK
1.1 集成SDK
AppGallery Connect以SDK的方式開放了其數據管理功能,在開發數據管理功能之前,首先需要先集成雲數據庫SDK,且需要下載AGC提供的JSON文件獲取應用的基本信息和數據處理位置信息等;其次,數據的展示需要依賴表格,此次我們選取了開源的自動化表格框架-SmartTable,同樣也需要先集成SDK。
1. 集成雲數據庫和SmartTable SDK之前,請確保您已經完成maven倉、AGC插件及編譯依賴的集成。
2. 在應用級build.gradle文件下配置集成雲數據庫和SmartTable SDK。
dependencies {
//agc-core的依賴
implementation 'com.huawei.agconnect:agconnect-core:1.6.0.300'
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
//雲數據庫sdk
implementation 'com.huawei.agconnect:agconnect-cloud-database:1.4.9.300'
compile 'com.github.huangyanbin:SmartTable:2.0'
}
上述SDK或依賴添加完成后,需要點擊右上角“Sync Now”等待同步完成。
開發准備
1.1 開通服務
1. 登錄AGC管理台,點擊“我的項目”,選擇之前創建的項目。
2. 在菜單目錄下找到“構建-雲數據庫”,點擊右上角“立即開通”,開通后界面如下,至此,雲數據庫服務已經開通成功。
1.2 新增雲數據庫數據對象
在對雲數據庫進行管理前,需要先新增雲數據庫數據對象。數據對象主要規定了數據庫存儲區中數據的類型,后續可以到處為對象添加到項目中使用。
1. 在雲數據服務界面選擇“對象類型”頁簽,點擊“新增”,對象類型填寫“personInfo”,新增“id”、“name”、“age”、“hasInoculate”、“cardNo”字段用於存儲檢測人群的身份數據。
2. 設置對象類型的索引或者對象類型中對某個字段的索引。此處我只設置了對name的索引,可酌情設置。
3. 設置數據管理的權限,此處按我的產品定位選的是管理員和數據創建人擁有所有權限即可。更多角色查看可參考權限管理。
1.3 新增存儲區
數據的增刪查需要在數據存儲區中進行,在進行上述操作管理某個對象類型的數據前需要先創建存儲區。此處,僅需指定存儲區的名稱即可,而后在代碼中往哪個存儲區中插入某個對象類型的數據。
在雲數據服務界面選擇“存儲區”頁簽,點擊“新增”,填寫存儲區名稱創建,此處以創建名為“personInfoZone”的存儲區為例介紹。
PS:“數據”頁簽下,可以根據存儲區和對象類型查詢數據,數據插入后可作為雲側查詢數據使用。
1.4 導入數據
您可以選擇“手動導入”和“批量導入”兩種方式導入檢測數據。
1. 手動導入
在“數據”頁簽下,選擇創建的對象類型及存儲區名稱,點擊“新增”。
按對象類型中的字段新增數據,此處以“personInfo”為例介紹:
2. 批量導入
在“數據”頁簽下,選擇創建的對象類型及存儲區名稱,點擊“數據模板”。
說明:數據模板為包含存儲區和對象類型信息的示例數據json文件,您可以直接新增數據后導入。
打開數據模板json文件,按對象類型字段新增數據。如下,新增了兩條有效數據:
點擊“… > 導入”,導入新增的數據,可增量新增json中的數據,如下圖:
說明:如數據存儲在Excel文件中,可先轉換為json文件再新增,Excel轉json方法請自行Google。
1.5 更新配置文件
雲數據庫服務開通后,AGC會將雲數據庫的對象類型等信息寫入JSON文件,故需要重新下載“agconnect-services.json”文件並在Android Studio項目中更新,詳細可參考系列上篇的“集成SDK-添加配置文件”章節。
界面設計
主功能界面的設計比較簡單,包含以下內容:
1. 檢測數據的展示表格;
2. 登出按鈕。
說明:此處為成功查詢到數據的界面示例,表格初始時為空。
數據對象導入
在開發准備章節新建的數據對象必須先導入Android Studio項目才能在代碼中對對象執行新建、插入、修改等操作。具體操作如下:
1. 登錄AGC,進入項目下的雲數據庫服務下。
2. 在對象類型頁簽下,點擊右上角“導出”,導出文件格式選擇“java”格式(因為我們開發的是Android項目,針對web等項目,AGC也提供js格式的對象類型格式文件等)。
3. 在src\main\java\com\example\packagename目錄下,新建名為model的package,並將剛剛下載的personInfo對象文件和對象幫助文件放在該目錄下。
數據庫初始化
本系統的業務需求為進入主界面即查詢導入的檢測數據,查詢前需要先對數據庫進行初始化,詳細請參考官方文檔-初始化。
1. 初始化AGConnectCloudDB、數據庫配置和存儲區,初始化后要在生命周期中隨時操作數據庫,故需要定義以下全局變量。
//初始化數據庫
AGConnectCloudDB mCloudDB;
//初始化數據庫配置
CloudDBZoneConfig mConfig;
//初始化存儲區
CloudDBZone mCloudDBZone;
//初始化表格
private SmartTable table;
//雲端數據對象List
private static List<personInfo> personInfoList = new ArrayList<>();
2. 完成獲取AGConnectCloudDB實例,創建對象類型,打開Cloud DB Zone一系列操作。(personInfo需要換成實際的存儲區名稱,此處Cloud DB Zone的同步配置屬性為緩存模式,訪問屬性為公共存儲區)。
private void initView() {
//初始化雲數據庫
AGConnectCloudDB.initialize(getApplicationContext());
AGConnectInstance instance = AGConnectInstance.buildInstance(new AGConnectOptionsBuilder().setRoutePolicy(AGCRoutePolicy.CHINA).build(getApplicationContext()));
mCloudDB = AGConnectCloudDB.getInstance(instance, AGConnectAuth.getInstance(instance));
Log.i(TAG,"The cloudDB is" + mCloudDB);
try {
mCloudDB.createObjectType(model.ObjectTypeInfoHelper.getObjectTypeInfo());
mConfig = new CloudDBZoneConfig("personInfoZone",
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("open clouddbzone", "open cloudDBZone success");
mCloudDBZone = cloudDBZone;
//開始綁定數據
bindData();
// Add subscription after opening cloudDBZone success
//addSubscription();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Log.w("open clouddbzone", "open cloudDBZone failed for " + e.getMessage());
}
});
} catch (AGConnectCloudDBException e) {
Toast.makeText(DatabaseActivity.this, "initialize CloudDB failed" + e, Toast.LENGTH_LONG).show();
}
}
綁定並查詢數據
1. 上步中bindData函數的作用是將AGC雲端導入的數據與SmartTable表格框架綁定,進而展示。
private void bindData() {
CloudDBZoneQuery<personInfo> query = CloudDBZoneQuery.where(personInfo.class);
queryPersonInfo(query);
}
private List<personInfo> queryPersonInfo(CloudDBZoneQuery<personInfo> query) {
if (mCloudDBZone == null) {
Log.w(TAG, "CloudDBZone is null, try re-open it");
return null;
}
Task<CloudDBZoneSnapshot<personInfo>> queryTask = mCloudDBZone.executeQuery(query,
CloudDBZoneQuery.CloudDBZoneQueryPolicy.POLICY_QUERY_FROM_CLOUD_ONLY);
//List<personInfo> tmpInfoList = new ArrayList<>();
queryTask.addOnSuccessListener(new OnSuccessListener<CloudDBZoneSnapshot<personInfo>>() {
@Override
public void onSuccess(CloudDBZoneSnapshot<personInfo> snapshot) {
try {
personInfoList = processQueryResult(snapshot);
} catch (AGConnectCloudDBException e) {
Log.e(TAG, "onfailed: "+e.getErrMsg() );
}
Log.i(TAG, "onSuccess: query result success");
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
mUiCallBack.updateUiOnError("Query failed");
Log.i(TAG, "onSuccess: query result failed");
}
});
return personInfoList;
}
2. processQueryResult為處理並展示雲端數據的主函數,此處需要將數據對象中的字段添加到list中,並添加到SmartTable中。
private List<personInfo> processQueryResult(CloudDBZoneSnapshot<personInfo> snapshot) throws AGConnectCloudDBException {
CloudDBZoneObjectList<personInfo> bookInfoCursor = snapshot.getSnapshotObjects();
List<personInfo> bookInfoList = new ArrayList<>();
List<PersonInfo> list = new ArrayList<>();
table = findViewById(R.id.table);
try {
while (bookInfoCursor.hasNext()) {
personInfo info = bookInfoCursor.next();
bookInfoList.add(info);
list.add(new PersonInfo(info.getId(),info.getName(),info.getAge(),info.getHasInoculate()==true?"是":"否",info.getCardNo()));
//list.add(new PersonInfo(1,"xuhao",34,true,"12321"));
}
} catch (AGConnectCloudDBException e) {
Log.w(TAG, "processQueryResult: " + e.getMessage());
} finally {
snapshot.release();
mCloudDB.closeCloudDBZone(mCloudDBZone);
}
table.setData(list);
table.getConfig().setContentStyle(new FontStyle(50, Color.BLUE));
mUiCallBack.onAddOrQuery(bookInfoList);
return bookInfoList;
}
3. 帳號登出后,系統會跳轉到登錄界面,調用AGConnectAuth. signOut方法即可,無需過多贅述。
findViewById(R.id.login_out).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AGConnectAuth.getInstance().signOut();
Intent intent = new Intent();
intent.setClass(DatabaseActivity.this, LoginActivity.class);
startActivity(intent);
Log.i(TAG, "onClick: log out successfully");
}
});
至此,核酸檢測結果查詢系統的開發工作已全部完成,運行后登錄系統即可查詢到雲數據庫雲端全部的檢測數據。
總結
AGC雲數據庫服務提供的端雲數據同步的能力還是非常實用,免除了服務器部署、數據管理等工作量。當然,除了數據查詢還可以在系統內直接實現新增或刪除數據等常見數據操作,雲數據庫服務提供的能力遠不止查詢而已。
至此,我們完成了核酸檢測結果系統的功能開發,此系統僅為Codelab挑戰賽主題功能的基本實現成功,大家可以基於指導文檔和Demo,結合自己的想象,為AGC Serverless服務的構造更多的可能性。
參考文檔:
雲數據庫雲端數據查詢:
開發准備和集成SDK必讀:
SmartTable原項目及集成指導:
https://github.com/huangyanbin/smartTable
附另一篇示例講解:【Codelabs挑戰賽示例講解1】核酸檢測結果認證查詢系統-認證登錄