乐趣区

关于android:Codelabs挑战赛示例讲解2核酸检测结果认证查询系统数据导入与查询

上文(【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'
// 云数据库 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 服务的结构更多的可能性。

退出移动版