上文(【Codelabs挑战赛示例解说1】核酸检测后果认证查问零碎-认证登录)实现了核酸检测后果认证查问零碎的认证登录局部的性能,认证登录实现后,接下来便是要实现核酸检测后果数据的导入与查问性能。
云数据库是一款端云协同的数据库产品,提供端云数据的协同治理、对立的数据模型和丰盛的数据管理API接口等能力,齐全能够满足数据的查问性能。
《Codelabs挑战赛——零根底搭建认证查问零碎》流动正在炽热进行中,分享作品有机会取得华为freebuds pro无线耳机、华为手环6nfc版、联盟背包等丰富大礼,快来参加吧>>https://developer.huawei.com/...
集成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'//云数据库sdkimplementation '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;//云端数据对象Listprivate 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服务的结构更多的可能性。