HarmonyOS笔记4:从云数据库获取数据

news2024/11/23 12:38:39

移动应用获取数据的方式主要有:
1.从网络中获取数据接口API。
2.从华为云数据库获取云数据库的资源。
3.从移动终端直接获取本地的数据
在HarmonyOS笔记3中已经完成了方式一从网络中获取数据接口API的方式。在本篇笔记中,将讨论从云数据库中获取数据。
因为采用SDK API12中模拟器测试一直不能成功,从技术论坛某篇求助帖看到,需要真机才能成功。因此,在这篇笔记中将采SDK API9的版本,开发工具是DevEco Studio 3.1.0版本。特此说明。
开发基于云数据库的移动应用需要按照下图的步骤进行:
在这里插入图片描述

一、注册华为开发者账号
访问网站“https://developer.huawei.com/consumer/cn/”,需要提供个人信息进行注册,并开通“实名认证”,具体操作略。
二、进入AGC控制台
登录华为开发者账号后,访问网站“https://developer.huawei.com/consumer/cn/service/josp/agc/index.html#/”进入"AppGallery Connect"控制台,如图1所示:
在这里插入图片描述
图1 AGC控制台

1.创建新的项目

在图1所示的页面中,点击“我的项目”。
在这里插入图片描述
图2 “我的项目“
在”我的项目"界面中,点击"添加项目”,进入项目编辑界面,配置项目信息。
在这里插入图片描述
图3 创建项目
设置项目的名称,并点击“创建并继续”,在后续的操作中,因为仅仅是一个测试应用,因此将默认的“为此项目启动分析服务”关闭,点击“完成”
在这里插入图片描述
图4 开通分析服务
如果希望开通,也可以直接启动分析服务。在此不再赘述。

2.创建新的应用

返回"AGC 控制台",选择"证书、APP ID和Profile"项目,如下图所示:
在这里插入图片描述
图5 AGC控制台
在AGC页面中,选择“证书、APP ID和Profile”,进入页面“证书、APP ID和Profile”,然后点击“新建”,如图5所示:
在这里插入图片描述
图5 选择 “APP ID”
在后续的APP ID页面中配置“设置应用开发基础信息”。
在这里插入图片描述
图6 编辑移动应用基础信息
注意,包名与后续开发的移动应用的包名一致。点击“下一步”,为新建的应用配置所属的项目,如下图所示。
在这里插入图片描述
图7 配置应用所属的项目
在点击“确认”后,开通“认证服务”。
在这里插入图片描述
图8 检索认证服务,并开通认证服务
在这里插入图片描述
图9 创建新应用成功

3.开通并配置云数据库

返回AGC 控制台,如图10所示,选择"云数据库":
在这里插入图片描述
图10 AGC 控制台
在AGC 控制台中,选择“云数据库”,进入图11所示的云数据库页面:
在这里插入图片描述
图11 云数据库
在云数据库页面中,选择“立即开通”。为指定的应用设置数据处理的位置。
在这里插入图片描述
图12 配置数据处理位置
配置云数据库所在的地理位置,此处配置为“中国”,设为默认位置,点击“确定”,进入“云数据库 for Object"。
在这里插入图片描述
图13 云数据库 for Object
点击”新建“,新建数据对象类型,如图14所示。
在这里插入图片描述
图14 配置数据对象类型名
然后分别依次配置数据对象类型的“字段”,“索引”和“数据权限”。
在这里插入图片描述
图15配置数据对象字段
在这里插入图片描述
图16配置索引
在这里插入图片描述
图17 配置数据权限
为了后续的操作方便,此处将所有的权限进行勾选。配置数据对象完毕后,继续执行导出数据类型对象的操作,如图18所示:
在这里插入图片描述
图18 数据类型对象
分别导出json格式文件和js格式文件。
在这里插入图片描述
图19 导出json格式文件
在这里插入图片描述
图20 导出js格式文件
导出的文件是一个压缩包,压缩包内包含一个js文件。将压缩包解压后的js文件(此处是MedalInfo.js)暂时保存起来,以备后续使用。此处导出的json文件和js文件均可以为后续的开发提供支持。
然后,设置数据对象类型(相当于数据表)的存储区。点击“新增”
在这里插入图片描述
图21 进入存储区
在这里插入图片描述
图22 配置存储区
在这里插入图片描述
图23 进入存储的数据
点击“新增”,进入数据的配置界面,如图24所示。
在这里插入图片描述
图24 新增数据
这种一个一个数据输入的方式非常繁琐,也可以直接批量导入数据。
在这里插入图片描述
图25 选择要导入文件操作
在这里插入图片描述
图26 选择要导入的文件
导入的文件格式是JSON形式,类似如下所示:

{
  "cloudDBZoneName": "MedalZone",
  "objectTypeName": "MedalInfo",
  "objects": [
    {
      "areaId": "CHN",
      "areaName": "中国",
      "goldMedal": 40,
      "silverMedal": 27,
      "bronzeMedal": 24,
      "areaIcon": "https://gstatic.olympics.com/s1/t_original/static/noc/oly/3x2/180x120/CHN.png"
    },
    {
      "areaId": "USA",
      "areaName": "美国",
      "goldMedal": 40,
      "silverMedal": 44,
      "bronzeMedal": 42,
      "areaIcon": "https://gstatic.olympics.com/s1/t_original/static/noc/oly/3x2/180x120/USA.png"
    },
	//...更多的记录略
}

此处:
“cloudDBZoneName”: “MedalZone”:表示存储区,与设置的数据类型的存储区名一致。
“objectTypeName”: “MedalInfo”:表示数据类型名称,与定义的数据类型名一致。
"objects"表示的是存储的数据,采用json数组的形式。
可以点击“查询”,可以检索的所有的数据,如图27所示。
在这里插入图片描述图27 检索所有的数据
返回AGC 控制的常规页面,如图28所示:
在这里插入图片描述
图28 常规页面
在该页面中下载下载最新的配置文件“agconnect-service.json”,为后续的移动开发提供支持。

三、开发移动应用

启动DevEco Studio 3.1.0版本,新建项目如下所示:
在这里插入图片描述
图28 创建项目
其中,包名必须与AGC 控制台创建应用的包名一致。

1.配置相关的文件

将下载的配置文件"agconnect-services.json"文件复制到resources/rawfile目录中,如图29所示:
在这里插入图片描述
图29 复制agconnect-services.json文件到rawfile目录
配置当前模块的module.json5文件,增加互联网访问权限的内容,代码片段如下所示:
在这里插入图片描述
图30 module.json5增加互联网访问权限

"requestPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      }
    ]

打开DevEco Studio 3.1.0 应用级oh-package.json5文件,在oh-package.json5文件里面添加SDK依赖,添加SDK依赖完成后,点击右上方“Sync Now”同步。

{
  "name": "entry",
  "version": "1.0.0",
  "description": "Please describe the basic information.",
  "main": "",
  "author": "",
  "license": "",
  "dependencies": {
    "@hw-agconnect/database-ohos":"^1.1.2",
    "@hw-agconnect/core-ohos": "^1.1.2"
  }
}

2.定义数据类型

在ets目录下创建一个model目录,将下载的数据类型的js文件,复制到model目录。另外,在model目录中新建一个app-schema.json文件,将上述导出的数据类型的json文件,复制粘贴到app-schema.json文件中。
在这里插入图片描述
图31 定义数据类型

3. 定义访问云数据库的服务

创建service目录,在该目录下定义一个typescript文件CloudDBService.ts文件,定义执行对云数据库操作的各种业务处理,具体代码如下:

import { AGConnectCloudDB, CloudDBZoneConfig, CloudDBZone, CloudDBZoneQuery } from '@hw-agconnect/database-ohos';
// @ts-ignore
import schema from '../model/app-schema.json';
import { AGCRoutePolicy } from "@hw-agconnect/core-ohos";
import { MedalInfo } from '../model/MedalInfo';


export class CloudDBService {
  //必须与AGC控制台指定云数据库的存储区名一致
  private static readonly ZONE_NAME = 'MedalZone';
  private static cloudDB: AGConnectCloudDB;
  private static cloudDBZone: CloudDBZone;
  private static isInit: boolean;

  /**
   * 初始化
   *
   * @param context context
   * @returns 是否初始化成功
   */
  public static async init(context: any): Promise<boolean> {
    if (this.isInit) {
      return;
    }
    try {
      // 初始化并获取AGConnectCloudDB
      this.cloudDB = await AGConnectCloudDB.getInstance({
        context: context, // 在eTS页面中通过全局方法getContext(this)获取当前页面关联的Context
        agcRoutePolicy: AGCRoutePolicy.CHINA, // 数据处理位置,CHINA-中国区,GERMANY-德国,RUSSIA-俄罗斯,SINGAPORE-新加坡
        objectTypeInfo: schema
      });

      // 打开存储区
      await this.openZone(this.ZONE_NAME);

      this.isInit = true;
    } catch (err) {
      console.error(`初始化失败,因为:${JSON.stringify(err)}`)
    }
    return Promise.resolve(this.isInit);
  }

  /**
   * 打开存储区
   *
   * @param zoneName 存储区名称
   * @returns
   */
  private static async openZone(zoneName: string): Promise<void> {
    if (this.cloudDBZone) {
      console.log('zone has been closed.')
      return;
    }
    try {
      const cloudDBZoneConfig = new CloudDBZoneConfig(zoneName);
      this.cloudDBZone = await this.cloudDB.openCloudDBZone(cloudDBZoneConfig);
      console.log('[openZone] open zone success.')
    } catch (e) {
      console.error('[openZone] open zone failed. e:' + e);
      console.error(JSON.stringify(e));
    }
  }

  /**
   * 查询并排序数据
   * * @param queryStr 查询条件,可为空
   * @returns 查询数据结果数组
   */
  public static async queryRecord(queryStr?: string): Promise<Array<MedalInfo>> {
    try {
      //按照金牌的个数进行排序
      const query = CloudDBZoneQuery.where(MedalInfo).orderByDesc("goldMedal");
      if (queryStr) {
        query.contains('areaName', queryStr);
      }
      const result = await this.cloudDBZone.executeQuery(query);
      return result.getSnapshotObjects();
    } catch (e) {
      console.error('[queryRecord] queryRecord failed. e:' + JSON.stringify(e));
      return [];
    }
  }
}

4. 定义Index.ets的UI页面

import { MedalInfo } from '../model/MedalInfo'
import { CloudDBService } from '../service/CloudDBService'

@Entry
@Component
struct Index {
  @State medalLst:Array<MedalInfo> = []

  onPageShow(){
    this.queryAll()
  }

  build() {
    Column(){
      Row({space:10}){
        Text("")
          .width(60)
          .height(20)
        Text("国家/地区")
          .width(60)
          .height(20)
        Text("金牌")
          .width(60)
          .height(20)
        Text("银牌")
          .width(60)
          .height(20)
        Text("铜牌")
          .width(60)
          .height(20)
      }
      List(){
        ForEach(this.medalLst,(item:MedalInfo)=>{
          ListItem(){
            Row({space:10}){
              Image(`${item.areaIcon}`)
                .width(60)
                .height(40)
              Text(`${item.areaName}`)
                .width(60)
                .height(40)
              Text(`${item.goldMedal}`)
                .width(60)
                .height(40)
              Text(`${item.silverMedal}`)
                .width(60)
                .height(40)
              Text(`${item.bronzeMedal}`)
                .width(60)
                .height(40)
            }
          }
          .width("100%")
          .margin(10)
        })
      }
    }.width("100%")
    .height("100%")
  }

  async queryAll(){
    try{
      // 初始化
      await CloudDBService.init(getContext(this));
      // 查询数据并展示
      this.medalLst = await CloudDBService.queryRecord();
    }catch(err){
       console.error(`出现错误:${JSON.stringify(err)}`)
    }
  }
}

5.运行结果

在这里插入图片描述
图32 最后的运行结果

后记

这篇笔记是比较艰难的一篇。一方面是在云数据库的配置,整个详细过程需要截取大量的图片;另外一方面,就是测试了若干版本的DevEco Studio,以及SDK API 12的版本测试云数据库,一直不能在模拟机中测试通过。直到看到这一帖子,让我不再纠结。因此,退而求其次,采用SDK API 9的版本。希望,过段时间,再出一篇SDK API 12版本云数据库处理的笔记。

参考文献

1.AppGallery Connect帮助中心 https://developer.huawei.com/consumer/cn/doc/app/agc-help-getstarted-0000001100316670
2.使用云数据库组件 https://developer.huawei.com/consumer/cn/doc/AppGallery-connect-Guides/agc-clouddb-component-harmonyosts-0000001623209420

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2039854.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

极狐GitLab CI/CD 如何构建镜像并推送到 azure 镜像仓库?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…

远程访问安全:rsync、ProFTPD、OpenSSH和VNC漏洞分析

文章目录 rsync未授权访问概念复现个别工具检测批量工具检测 proftpd远程命令介绍CVE-2015-3306复现 openssh信息泄露介绍复现 libssh身份绕过介绍条件危害复现 向日葵远程RCE介绍条件靶场&#xff1a; VNC配置不当介绍复现 在当今高度互联的数字时代&#xff0c;远程访问工具已…

[Qt][Qt 事件][上]详细讲解

目录 1.事件介绍2.事件的处理3.鼠标事件4.按键事件5.moveEvent6.resizeEvent 1.事件介绍 事件是应⽤程序内部或者外部产⽣的事情或者动作的统称 在Qt中使⽤⼀个对象来表⽰⼀个事件&#xff0c;所有的Qt事件均继承于抽象类QEvent 事件是由系统或者Qt平台本⾝在不同的时刻发出的…

深入理解C#中的yield关键字:提升迭代性能与效率

文章目录 前言一、yield return二、yield break总结 前言 在C#中&#xff0c;yield 关键字是特别用于迭代器块和方法中的&#xff0c;它允许你逐个返回序列中的元素&#xff0c;而不是一次性返回整个集合。使用 yield 可以显著提高处理大数据集或进行复杂迭代时的性能和内存效率…

【数据结构初阶】队列经典习题两道

hello&#xff01; 我是云边有个稻草人 目录 一、用队列实现栈 二、用栈实现队列 Relaxing Time &#xff01; 正文开始—— 一、用队列实现栈 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 根据题目要求&#xff0c;我们要用两个队列来实现栈的相关功能&…

虚拟机上使用Ubuntu1804上编译qt5.12.9部署到jetson nano上

开发qt界面&#xff0c;基于Qt5.12.9&#xff0c;开发环境使用虚拟机加载Ubuntu1804&#xff0c;开发完成后的qt程序最后部署到jetson nano上&#xff0c;使用的通用编译器是gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu 安装编译器 本文中直接将gcc-linaro-7.5.0-2019.…

汇昌联信做拼多多店铺如何运营?

汇昌联信如何在拼多多上运营店铺&#xff0c;是许多电商新手和希望扩展市场的商家所关注的问题。在这个快速发展的电商平台上&#xff0c;掌握正确的运营策略&#xff0c;对于提升店铺销量、增强品牌影响力至关重要。接下来&#xff0c;我们将详细探讨如何有效运营拼多多店铺。…

Angular由一个bug说起之九:AWS S3 文件下载问题

引言 在现代 Web 开发中&#xff0c;我们经常需要处理来自全球不同地区的数据&#xff0c;这包括文件名中可能包含的非拉丁文字符。最近&#xff0c;在一个项目中&#xff0c;我们遇到了一个与 Amazon S3 服务相关的挑战&#xff0c;涉及到文件名编码的处理。当从 S3 下载文件…

Redis分布式部署方式-主从复制

分布式部署Redis方式 分布式系统&#xff0c;涉及到一个非常关键的问题&#xff1a;单点问题 单点问题&#xff1a;如果某个服务器&#xff0c;只有一个节点&#xff08;只搞一个物理服务器&#xff0c;来部署这个服务器程序&#xff09;&#xff0c;会遇到一些困难&#xff…

多线程学习之ThreadLocal详细笔记

ThreadLocal详细笔记 一、ThreadLocal的基本概念二、ThreadLocal的独特性2.1 数据访问方式2.2 线程安全实现2.3 适用场景 三、ThreadLocal 的简单使用四、ThreadLocal 的工作原理五、ThreadLocal和内存泄漏的关系5.1 ThreadLocalMap的Entry的Key设计成弱引用5.2 弱引用会导致内…

超简单4行代码-STM32F103的HAL实现有源蜂鸣器报警

1、概述 在嵌入式项目开发中&#xff0c;使用蜂鸣器作为简单的报警或提示装置非常常见。根据不同的应用场景&#xff0c;我们可能会选择有源蜂鸣器或无源蜂鸣器。本文将重点介绍如何通过STM32F103系列单片机&#xff0c;利用HAL库&#xff0c;仅通过4行代码实现对有源蜂鸣器的…

django学习入门系列之第九点《初识MySQL》

文章目录 9.1 初识网站9.2 初识MySQL下载安装创建配置文件初始化启动MySQL服务进入mysql查看已有文件夹退出&#xff08;关闭连接&#xff09;忘记密码 往期回顾 9.1 初识网站 Python相关:基础、函数、数据类型、面向、模块。前端开发直观:HTML、CSS、JavaScript、jQuery:[静态…

【运维】JetBrains Gateway (Pycharm) SSH免密连接,改为免密连接

一直要求输入密码&#xff0c;很烦人&#xff1a; 如何免密连接&#xff1f; 1 重新打开gateway&#xff0c;来到这个界面点新建连接&#xff1a; 2 点这里设置&#xff1a; 3 在这一页&#xff0c;你可以改你的所有配置&#xff0c;只要设置为password并且保存密码&…

详解Redis 高可用的方式 Redis Cluster

Redis 高可用方式 Redis 提供了多种高可用性方案&#xff0c;主要包括以下几种方式&#xff1a; 主从复制&#xff08;Replication&#xff09; 主从复制是最基本的高可用性方案&#xff0c;通过将数据从一个主节点复制到多个从节点来实现数据的冗余和读写分离。主节点负责所…

数据结构--数据结构概述

一、数据结构三要素 1. 数据的逻辑结构 数据的逻辑结构是指数据元素之间的关系和组织方式&#xff0c;通常分为线性结构和非线性结构。 线性结构&#xff1a;例如线性表&#xff0c;其中数据元素按照顺序排列&#xff0c;彼此之间存在一对一的关系。 非线性结构&#xff1a;…

android车载手机互联投屏新专题-实战作业布置

背景&#xff1a; 学习了马哥的投屏实战开发课程后&#xff0c;大家都可以实现如下图一样的手机车机多端互联的投屏场景。 即已经实现了手机和车机投屏互动&#xff0c;车机上手机画面屏幕可以与手机实体屏幕一样就是常见的Mirror模式&#xff0c;如果不一样就是课程里面讲的扩…

解析网络流量管理方案:简化基于云的DNS负载均衡

数字化时代&#xff0c;网络规模和流量需求的增长&#xff0c;催生了用户对可用性的需求、管理员对更好的访问和管理等需求。在大型的网络应用中&#xff0c;为保障站点的稳定性&#xff0c;会为服务或站点提供多台服务器&#xff0c;以平均分配每台服务器上的压力&#xff0c;…

上门做饭小程序项目源码功能介绍

上门做饭小程序通常包含以下功能&#xff0c;以便用户方便地享受到上门做饭的服务&#xff1a; 用户注册与登录&#xff1a;允许用户创建账户并登录&#xff0c;管理个人信息和偏好。 菜品浏览与选择&#xff1a;提供各种菜品的列表或菜单&#xff0c;用户可以浏览菜品详情、价…

C++STL详解(五)——list类的具体实现

一.本次所需实现的三个类及其成员函数接口 链表首先要有结点&#xff0c;因此我们需要实现一个结点类。 链表要有管理结点的结构&#xff0c;因此我们要有list类来管理结点。 链表中还要有迭代器&#xff0c;而迭代器的底层其实是指针。但是我们现有的结点类无法完成迭代器的…

在VB.net中,对数据排名次,用LINQ、SortedSet,还是用SortedList速度快

标题 在VB.net中&#xff0c;对数据排名次&#xff0c;用LINQ、SortedSet&#xff0c;还是用SortedList速度快 正文 在VB.NET中&#xff0c;选择最适合你需求的排序和索引方法时&#xff0c;需要考虑到数据的规模、是否需要频繁地更新数据结构、以及是否只需要排序结果或还需要…