文章目录

一、端云一体化开发基本概念

为丰富HarmonyOS对云端开发的支持、实现端云联动,DevEco Studio以Cloud Foundation Kit(云开发服务)为底座、在传统的“端开发”基础上新增“云开发”能力,开发者在创建工程时选择合适的云开发工程模板,即可在DevEco Studio内同时完成HarmonyOS应用/元服务的端侧与云侧开发,体验端云一体化协同开发。

1、传统架构

img

2、端云一体化架构

img

3、端云一体化开发特性

img

特点:

  • DevEco Studio一套开发工具即可支撑端侧与云侧同时开发,无需搭建服务器;
  • 依托AGC中Serverless云服务开放的接口,端侧开发人员能轻松操作云函数以及云数据库中的数据;
  • 直接接入AGC Serverless云服务,实现免运维,无运维成本或资源浪费。

优势:

img

4、工作原理

DevEco Studio支持开发者在本地完成云侧服务资源的开发与部署,并可在端侧工程中调用您开发的云侧代码,真正实现端云一体化开发。

  1. 选择合适的云开发模板,根据工程向导创建端云一体化开发工程。

  2. 分别进行云侧工程与端侧工程的代码开发与调试。

    1. 开发云侧工程:在云侧工程开发Cloud Foundation Kit提供的云端服务,目前包括云函数、云对象和云数据库资源开发。
      • 开发云函数:在DevEco Studio中创建并配置函数、开发函数代码、调试函数、部署函数到AGC云端。
      • 开发云对象:在DevEco Studio中创建云对象、开发云对象代码、调试云对象、部署云对象到AGC云端。
      • 开发云数据库:在DevEco Studio中创建对象类型、在对象类型中添加数据条目、部署云数据库到AGC云端。
    1. 部署云侧工程:云侧工程代码全部开发调试完毕后,一键部署云侧工程到AGC云端。
    2. 开发端侧工程:在端侧工程下开发您应用的业务代码。本文档仅描述如何在端侧调用您开发的云侧代码,包括调用云函数、调用云对象、访问云数据库、调用云存储。
  1. 端云两侧工程代码全部开发完成后,将端云一体化工程打包成APP,提交至AGC申请上架。

img

说明

云侧与端侧工程的代码可并行开发,一般无先后顺序。但若需在端侧代码中调用云侧代码,云侧代码必须先部署到AGC云端,因此建议您先完成云侧代码的开发、调试与部署,再进行端侧代码开发与调试。

5、注意事项

仅支持手机,且不支持使用模拟器运行调试。当前仅在中国境内(不包含中国香港、中国澳门、中国台湾)提供服务。当前仅支持手动签名。手动签名的教程:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V14/ide-signing-V14#section297715173233

6、开发准备

6.1、打开AGC网址

https://developer.huawei.com/consumer/cn/service/josp/agc/index.html#/

img

6.2、点击我的项目,进入创建项目阶段

img

6.3、创建项目

img

img

点击完成即可创建,下面教大家如何创建应用

6.4、打开下面图片所选中区域

img

6.5、创建APPID(其实就是创建应用)

img

其实创建AppId其实就是在创建应用,在创建应用之前记得先创建项目,如果之前已经创建过项目那就忽略;

img

img

点击确认即可创建完成

6.6、最后大家点击我的项目里面可以查看到应用

img

6.7、配置数据处理位置

二、开发端云工程

注意:仅支持手机,且不支持使用模拟器运行调试,必须要手动签名

1、创建鸿蒙端云一体化应用工程

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/agc-harmonyos-clouddev-overview

1.1、新建工程

在菜单栏选择“File > New > Create Project”来创建一个新工程。

img

1.2、选择模板

在“Application”页签,选择合适的云开发模板,然后点击“Next”

说明

当前仅支持通用云开发模板([CloudDev]Empty Ability)。

img

1.3、配置工程信息

img

参数 说明
Project name 工程的名称,由大小写字母、数字和下划线组成。
Bundle name 软件包名称,需保证唯一,且需与您在AGC创建的HarmonyOS应用的“应用包名”一致。
Save location 工程文件本地存储路径,由大小写字母、数字和下划线等组成,不能包含中文字符。
Compatible SDK 兼容的最低API Version。使用基于Cloud Foundation Kit(云开发服务)的端云一体化开发功能,请选择5.0.0(12)。
Module name 模块名称。
Device type 该工程模板支持的设备类型,目前仅支持手机设备。
Enable CloudDev 是否启用云开发。云开发模板默认启用且无法更改。

1.4、关联云开发资源

img

如您尚未登录DevEco Studio,点击“Sign In”,在弹出的账号登录页面,使用已实名认证的华为开发者账号完成登录。

这种提示代表着你现在登录得华为账号里面再AGC里面没对应包名得应用,找不到,所以大家包名一定要写对,或者大家去AGC创建一个新的应用对应这个bundle name

修正之后包名

大家选中对应需要关联得云开发的应用,然后点击finish

1.5、进入主开发界面

进入主开发界面,DevEco Studio执行工程同步操作,端侧执行“ohpm install”,云侧执行“npm install”,分别下载端侧和云侧依赖。

img

2、集成认证

云认证开发文档:https://developer.huawei.com/consumer/cn/doc/app/agc-help-auth-0000002236336998

2.1、AGC端开通云认证服务

2.2、项目签名以及证书申请

签名步骤:https://developer.huawei.com/consumer/cn/doc/app/agc-help-auth-integration-sdk-0000002236337006

2.2.1、项目手动签名

HarmonyOS应用/元服务通过数字证书(.cer文件)和Profile文件(.p7b文件)来保证应用/元服务的完整性。在申请数字证书和Profile文件前,首先需要通过DevEco Studio来生成密钥(存储在格式为.p12的密钥库文件中)和证书请求文件(.csr文件)。然后,申请调试数字证书和调试Profile文件。最后,将密钥(.p12)文件、数字证书(.cer)文件和Profile(.p7b)文件配置到工程中。

基本概念

  • 密钥:格式为.p12,包含非对称加密中使用的公钥和私钥,存储在密钥库文件中,公钥和私钥对用于数字签名和验证。
  • 证书请求文件:格式为.csr,全称为Certificate Signing Request,包含密钥对中的公钥和公共名称、组织名称、组织单位等信息,用于向AppGallery Connect申请数字证书。
  • 数字证书:格式为.cer,由华为AppGallery Connect颁发。
  • Profile文件:格式为.p7b,包含HarmonyOS应用/元服务的包名、数字证书信息、描述应用/元服务允许申请的证书权限列表,以及允许应用/元服务调试的设备列表(如果应用/元服务类型为Release类型,则设备列表为空)等内容,每个应用/元服务包中均必须包含一个Profile文件。
2.2.2.1、生成密钥和证书请求文件
  • 在主菜单栏单击Build > Generate Key and CSR
  • Key store file中,可以单击Choose Existing选择已有的密钥库文件(存储有密钥的.p12文件);如果没有密钥库文件,单击New进行创建。

  • Create Key Store窗口中,填写密钥库信息后,单击OK

    • Key store file:设置密钥库文件存储路径,并填写p12文件名。

    • Password:设置密钥库密码,必须由大写字母、小写字母、数字和特殊符号中的两种以上字符的组合,长度至少为8位。请记住该密码,后续签名配置需要使用。

    • Confirm password:再次输入密钥库密码。

  • Generate Key and CSR界面中,继续填写密钥信息后,单击Next

    • Alias:密钥的别名信息,用于标识密钥名称。请记住该别名,后续签名配置需要使用。

    • Password:密钥对应的密码,与密钥库密码保持一致,无需手动输入。

  • Generate Key and CSR界面,设置CSR文件存储路径和CSR文件名。

  • 单击Finish,创建CSR文件成功,可以在存储路径下获取生成的密钥库文件(.p12)、证书请求文件(.csr)和material文件夹(存放签名方案相关材料,如密码、证书等)。
2.2.2.2、申请调试证书和Profile文件
  • 申请调试证书

    • 登录AppGallery Connect,选择“证书、APP ID和Profile”。

    • 在左侧导航栏选择“证书、APP ID和Profile > 证书”,进入“证书”页面,点击“新增证书”。

    • 在弹出的“新增证书”窗口填写要申请的证书信息,点击“提交”。
  • 申请调试Profile

    • 登录AppGallery Connect,选择“证书、APP ID和Profile”。

    • 在左侧导航栏选择“证书、APP ID和Profile > Profile”,进入“Profile”页面,点击右上角“添加”。

    • 在“添加Profile”页面,填写应用名称、Profile名称等必填信息。

  • 点击“下载”,将生成的Profile保存至本地,供后续签名使用。

2.2.2.3、手动配置签名信息

在DevEco Studio中配置密钥(.p12)文件、申请的调试证书(.cer)文件和调试Profile(.p7b)文件。

File > Project Structure > Project > Signing Configs窗口中,取消勾选“Automatically generate signature”和“Associate with registered application”,然后配置工程的签名信息。

  • Store file:选择密钥库文件,文件后缀为.p12,该文件为生成密钥和证书请求文件中生成的.p12文件。
  • Store password:输入密钥库密码,该密码与生成密钥和证书请求文件中填写的密钥库密码保持一致。
  • Key alias:输入密钥的别名信息,与生成密钥和证书请求文件中填写的别名保持一致。
  • Key password:输入密钥的密码,与生成密钥和证书请求文件中填写的Store Password保持一致。
  • Sign alg:签名算法,固定为SHA256withECDSA。
  • Profile file:选择申请调试证书和调试Profile文件中生成的Profile文件,文件后缀为.p7b。
  • Certpath file:选择申请调试证书和调试Profile文件中生成的数字证书文件,文件后缀为.cer。

2.2.3、项目配置Client ID

2.2.3.1、配置Client ID

在工程中entry模块的module.json5文件中,新增metadata,配置name为client_id,value为上一步获取的Client ID的值,如下所示:

2.3、AGC项目配置公钥指纹

2.4、本地项目添加应用配置文件

  • 下载应用“agconnect-services.json”文件。

  • 将“agconnect-services.json”文件拷贝到DevEco Studio项目的“AppScope/resources/rawfile”目录下(没有该目录自己创建)

  • 配置SDK依赖

    • 打开工程,在命令行窗口执行cd entry命令,切换到工程的“entry”目录。

    • 安装SDK到项目中

      ohpm install @hw-agconnect/auth
      

2.5、本地项目实现云认证服务

云认证登录:https://developer.huawei.com/consumer/cn/doc/AppGallery-connect-References/harmonyos-arkts-auth-0000001680370685

2.5.1、初始化认证服务
async onCreate() {
  this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);
  
  let file = this.context.resourceManager.getRawFileContentSync('agconnect-services.json');
  let json: string = buffer.from(file.buffer).toString();
  auth.init(this.context, json);

  hilog.info(HILOG_DOMAIN, TAG, '%{public}s', 'Ability onCreate');
}
2.5.2、登录认证功能
/**
   * 打开元服务静默登录获取用户信息
   */
  async silentLogin() {
    try {   
      /**
      * 云环境认证登录
      */
      await this.cloudAuth();
        
      const loginRequest = new authentication.HuaweiIDProvider().createLoginWithHuaweiIDRequest();
      loginRequest.forceLogin = false;
      loginRequest.state = util.generateRandomUUID();
      const controller = new authentication.AuthenticationController();
      await controller.executeRequest(loginRequest).then(async (response: authentication.LoginWithHuaweiIDResponse) => {
         
        const loginWithHuaweiIDResponse = response as authentication.LoginWithHuaweiIDResponse;
        const state = loginWithHuaweiIDResponse.state;
        if (state && loginRequest.state !== state) {
          return;
        }
        const loginWithHuaweiIDCredential = loginWithHuaweiIDResponse.data!;
        const openID = loginWithHuaweiIDCredential.openID;
        const code = loginWithHuaweiIDCredential.authorizationCode;
        const unionID = loginWithHuaweiIDCredential.unionID;
       
      })
        .catch((error: BusinessError) => {
      })
    } catch (error) {
      this.dealAllError(error);
    }
  }
  /**
   * 云认证
   */
  async cloudAuth() {
    try {
      let user = await auth.getCurrentUser();
      // 调用云认证服务进行华为账号登录
      if(!user) {
        await auth.signIn({
          autoCreateUser: true, // 开启自动创建用户功能
          'credentialInfo': {
            // 认证凭证配置
            'kind': 'hwid'            // 指定华为账号认证方式
          }
        })
      }
      //初始化云环境
      let authProvider = await auth.getAuthProvider();
      await cloudCommon.init({
        region: cloudCommon.CloudRegion.CHINA, //数据存储地址
        authProvider: authProvider, //认证放数据
        functionOptions: { timeout: 10 * 1000 }, //云函数初始化设置。
        storageOptions: {
          mode: request.agent.Mode.BACKGROUND,
          network: request.agent.Network.ANY
        }, //云存储初始化设置。
        databaseOptions: { schema: "schema.json" } //云数据库初始化设置。
      })
    } catch (err) {
    }
  }
  /**
   * 异常处理
   */
  dealAllError(error: BusinessError): void {
    /*
     * In app sign-in scenarios involving UI interactions,
     * it is recommended to guide users with the following error code prompts:
     * */
    if (error.code === ErrorCode.ERROR_CODE_LOGIN_OUT) {
      /*
       * The user has not signed in with a HUAWEI ID.
       * Use a HUAWEI ID to sign in and try again, or sign in to the app in another way.
       * */
    } else if (error.code === ErrorCode.AUTHENTICATION_NETWORK_ERROR) {
      // Network exception. Check the current network status and try again, or sign in to the app in another way.
    } else if (error.code === ErrorCode.ERROR_CODE_INTERNAL_ERROR) {
      // Sign-in failed. Try another sign-in option.
    } else if (error.code === ErrorCode.ERROR_CODE_USER_CANCEL) {
      // The user cancels the authorization.
    } else if (error.code === ErrorCode.ERROR_CODE_SYSTEM_SERVICE) {
      // System service exception. Try again later or sign in to the app in another way.
    } else if (error.code === ErrorCode.ERROR_CODE_REQUEST_REFUSE) {
      // Repeated request. No further action is needed.
    } else {
      // Sign-in failed. Try another sign-in option.
    }
  }

2.6、端云一体化开发工程目录结构

端云一体化开发工程主要包含端开发工程(Application)与云开发工程(CloudProgram)。

2.6.1、端开发工程(Application)

通用云开发模板的端开发工程目录结构如下图所示,“src/main/ets/pages”下包含了云存储、云数据库和云函数页面。

img

2.6.2、云开发工程(CloudProgram)

在云开发工程中,您可为您的应用开发云端代码,包括云函数和云数据库服务代码。通用云开发模板的云开发工程目录结构如下图所示。

img

三、开发云函数

云函数开发指南:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/cloudfoundation-arkts-api

1、云函数的应用场景

鸿蒙(HarmonyOS)端云一体化中的云函数(Cloud Function)是一种将部分业务逻辑部署在云端执行的Serverless服务,能够与端侧设备(手机、IoT设备等)无缝协同,提升应用灵活性、可扩展性和开发效率。以下是其典型应用场景及优势:

1.1、 复杂计算与数据处理

  • 场景:端侧设备(如智能手表、传感器)算力有限,需依赖云端处理大数据分析、图像识别、音视频转码等任务。
    • 示例:智能家居摄像头将视频流上传至云端,云函数调用AI模型进行人脸识别后,仅将结果返回端侧。
  • 优势:降低端侧功耗,缩短响应时间。

1.2、弹性扩展的后端服务

  • 场景:应对突发流量(如电商秒杀、活动报名),云函数自动扩缩容,避免端侧直接对接固定服务器。
    • 示例:鸿蒙应用在促销期间通过云函数处理订单,高峰期自动扩容,结束后释放资源。
  • 优势:节省运维成本,避免服务宕机。

1.3、设备间协同与数据同步

  • 场景:多设备(手机、平板、智能家居)需实时同步状态或共享数据。
    • 示例:家庭多台鸿蒙设备通过云函数同步温控设置,端侧仅需订阅云端状态变更。
  • 优势:减少端侧直接通信的复杂度,提升可靠性。

1.4、安全敏感操作

  • 场景:涉及支付、身份验证等需高安全性的逻辑,移至云端执行。
    • 示例:鸿蒙支付应用调用云函数完成交易风控校验,端侧仅传递加密参数。
  • 优势:避免密钥或算法泄露,符合合规要求。

1.5、离线任务与定时触发

  • 场景:端侧离线时提交任务,云端定时或延迟执行(如数据备份、提醒推送)。
    • 示例:鸿蒙健康应用在无网络时记录运动数据,网络恢复后由云函数统一处理并生成周报。
  • 优势:提升用户体验,保证数据完整性。

1.6、第三方服务集成

  • 场景:快速对接地图、支付、社交等开放API,无需端侧适配各平台。
    • 示例:鸿蒙外卖应用通过云函数聚合第三方配送接口,统一返回标准化数据给端侧。
  • 优势:降低端侧代码复杂度,便于维护。

1.7、动态业务逻辑更新

  • 场景:频繁调整的业务规则(如优惠券发放策略)通过云函数动态下发。
    • 示例:电商App的促销规则由云端配置,端侧调用云函数实时获取最新逻辑。
  • 优势:避免端侧频繁发版,快速响应市场变化。

1.8、物联网(IoT)设备管理

  • 场景:海量IoT设备需云端统一管控(固件升级、状态监控、指令下发)。
    • 示例:鸿蒙生态的智能农业传感器通过云函数汇总数据并触发灌溉指令。
  • 优势:集中管理设备,降低端侧资源占用。

2、云函数开发流程

  • 无缝开发体验:使用ArkTS/JS编写,同一套代码可部署在端侧或云端。
  • 低延迟:华为全球分布式云基础设施优化网络链路。
  • 安全性:端到端加密通信和细粒度权限控制。
  • 成本优化:按需付费的Serverless模式,适合中小开发者。

2.1、创建函数

右击“cloudfunctions”目录,选择“New > Cloud Function”。

img

img

“cloudfunctions”目录下生成新建的“my-function”函数目录,目录下主要包含如下文件

img

img

其他详细配置参考官方文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/agc-harmonyos-clouddev-createfunc-V5

云函数和云对象区别:

云对象是一种特殊的云函数,本质是对云函数的一种封装,客户端可通过导入一个云对象来直接使用这个对象的方法,为您提供在端侧直接调用云侧代码的开发体验。相对普通云函数方式,云对象代码更精简、逻辑更清晰,大多数场景下推荐使用云对象代替传统云函数

2.2、开发函数

打开函数入口文件myFunction.ts

img

注意

云函数与云函数之间是相互独立的,部署至云侧时,只会部署所选云函数目录下的文件,不可在一个云函数中通过import '…/anotherDirectory/xxx’的方式引入依赖。如果有多个云函数公共的配置,建议存储在云数据库中,通过云数据库Server API类查询出公共配置;也可以将多个云函数整合成一个云对象,将公共配置变成云对象的私有配置。

2.3、调试函数

本地调用

在DevEco Studio调试本地开发好的函数。支持单个调试和批量调试,并支持Run和Debug两种模式,调试功能丰富,常在函数开发过程或问题定位过程中使用

img

在下方通知栏“cloudfunctions”窗口,查看调试日志。如果出现“Cloud Functions loaded successfully”,表示函数成功加载到本地运行的HTTP Server中,并生成对应的Function URI。

img

在菜单栏选择“View > Tool Windows > Cloud Functions Requestor”,使用事件模拟器(Cloud Functions Requestor)触发函数调用。

img

在弹出的“Cloud Functions Requestor”面板,配置触发事件参数。

img

点击“Trigger”, 将会触发执行用户函数代码。执行结果将展示在“Result”框内,“cloudfunctions”窗口同时打印调试日志。

通过远程调用方式调试函数

您还可以将函数部署至AGC云端,然后在DevEco Studio调用云端函数,以测试函数在云端的运行情况、或补充测试因各种因素限制未能在本地调试中发现的问题。

img

2.4、部署函数

完成函数代码开发后,您可将函数部署到AGC云端,支持单个部署和批量部署。

  • 单个部署

单个部署,直接右击需部署的函数目录,选择“Deploy ‘函数名’”即可,后续流程与批量部署相同。

img

您可在底部状态栏右侧查看函数打包与部署进度。

请您耐心等待,直至出现“Deploy successfully”消息,表示所有函数均已成功部署。

img

在菜单栏选择“Tools > CloudDev”。

img

img

  • 批量部署

鼠标右击

img

img

其他步骤和单个部署一样

2.5、在端侧调用云函数

先确保云函数正确开发并部署在AGC上

  • 在代码文件中引入Cloud Foundation Kit
import { cloudFunction } from '@kit.CloudFoundationKit';
import { BusinessError } from '@kit.BasicServicesKit';
  • 调用您云侧部署的云函数
private getMyFunction() {
  // name是云函数的名字
  cloudFunction.call({ name: 'my-function' }).then((res: cloudFunction.FunctionResult) => {
    this.result = JSON.stringify(res.result)
  }).catch((err: BusinessError) => {
    console.log('err get myFunction:' + err)
  });
}
  • 修改EntryAbility文件里面启动页面(方便测试)

注意:切记需要在真机上面测试,而且工程已经进行手动签名

  • 打包构建到真机上点击按钮获取结果

img

四、开发云数据库

云数据库开发指南:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/cloudfoundation-arkts-api

1、创建对象类型

对象类型(ObjectType)用于定义存储对象的集合,不同的对象类型对应的不同数据结构。每创建一个对象类型,云数据库会在每个存储区实例化一个与之结构相对应的对象类型,用于存储对应的数据。

右击“clouddb/objecttype”目录,选择“New > Cloud DB Object Type”。

img

img

1.1、参数说明

参数 必选(M)/可选(O) 说明
fieldName M 字段名称。输入要求具体如下:字段的名称长度必须大于或等于1个字符,小于或等于30个字符,只能包含以下3种类型,并且至少包含“字母”类型:字母(A-Z或a-z)数字(0-9)特殊字符:_字段名称必须以字母开头,以字母或者数字结尾。字段名称中不区分字母的大小写。修改对象类型时,支持删除字段。字段名称不允许使用系统保留字段名称: naturalbase_version、naturalbase_deleted、naturalbase_operationtype、naturalbase_creator、naturalbase_accesstime、naturalbase_operationtime、naturalbase_syncstatus、naturalbase_changedfieldsbitmap、naturalbase_lastmodifier、cmin、cmax、xmin、xmax、ctid、oid、tableoid、xc_node_id、tablebucketid、rowid。说明
fieldType M 字段的数据类型。当前支持的数据类型:String、Boolean、Byte、Short、Integer、Long、Float、Double、ByteArray、Text、Date。
belongPrimaryKey O 设置该字段是否为对象类型的主键,默认值为false。至少设置一个字段为主键。支持设置复合主键,由多个字段组合成为主键,一个复合主键包含的字段小于等于5个,复合主键字段顺序与字段的顺序一致。数据类型为ByteArray、Text、Date、Double、Float和Boolean的字段不支持设置为主键。主键的值不允许更改。
notNull O 设置字段值是否为非空,默认值为false。数据类型为ByteArray和Date的字段不支持设置为非空。主键默认非空,且不允许更改。设置为非空的字段不支持加密和敏感。
isNeedEncrypt O 设置字段是否需要加密,开启全程加密数据管理功能,默认值为false。选择加密后,该字段对应的数据会加密存储在存储区中。主键字段不支持加密。加密的字段不支持设置为非空。加密的字段不支持设置为敏感字段。一个对象类型中包含的加密字段和敏感字段的总数需小于或等于5个。字段设置为加密后,不支持导出该字段的数据值。数据类型为ByteArray、Text的字段不支持加密。对象类型创建成功后,不支持修改加密属性。
isSensitive O 设置字段是否为敏感字段,默认值为false。选择敏感后,该字段对应的数据会加密存储在存储区中。敏感字段不支持设置为主键。敏感字段不支持设置为非空。敏感字段不支持设置为加密。敏感字段不支持设置为默认值。对象类型创建成功后,不支持修改敏感属性。仅支持数据类型为Byte、Short、Integer、Long、Float、Double、String和Date的字段设置为敏感字段。敏感字段不支持设置为索引。一个对象类型中包含的加密字段和敏感字段的总数需小于或等于5个。
defaultValue O 字段为非空时,必须设置默认值。主键不支持设置默认值。加密字段和敏感字段不支持设置默认值。数据类型为ByteArray、Date不支持为其设置默认值。数据类型为Text的字段设置默认值时,默认值的长度小于或等于200个字符。

这边先创建一个User对象类型

{
  "objectTypeName": "User",
    "fields": [
    {"fieldName": "id", "fieldType": "Integer", "notNull": true, "belongPrimaryKey": true},
    {"fieldName": "sex", "fieldType": "Integer", "notNull": true, "defaultValue": 0},
    {"fieldName": "username", "fieldType": "String"},
    {"fieldName": "password", "fieldType": "String"}
  ],
    "indexes": [
    {"indexName": "id_index", "indexList": [{"fieldName":"id","sortType":"ASC"}]}
  ],
    "permissions": [
    {"role": "World", "rights": ["Read"]},
    {"role": "Authenticated", "rights": ["Read", "Upsert"]},
    {"role": "Creator", "rights": ["Read", "Upsert", "Delete"]},
    {"role": "Administrator", "rights": ["Read", "Upsert", "Delete"]}
  ]
}

1.2、数据类型

云数据库支持多种数据类型,如下表所示,描述了支持的各种数据类型及其排序说明。

数据类型 描述 取值范围 说明 排序方式
String 字符串类型 最大长度200 如果字符串长度超过200,建议使用Text类型。 采用 UTF-8 编码的字节顺序
Boolean 布尔类型 true:真false:假 - false < true
Byte 单字节整型 -128 ~ +127 - 数字顺序
Short 双字节整型 -32,768 ~ +32,767 -
Integer 四字节整型 -2,147,483,648 ~ +2,147,483,647 -
Long 八字节整型 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 由于JavaScript不支持数据类型“Long”,Web SDK通过引入第三方开源组件实现支持数据类型“Long”的能力。“Long”类型的使用方法请参考https://github.com/dcodeIO/long.js。
Float 单精度浮点数 -3.40E+38 ~ +3.40E+38,6位十进制有效数字。 -
Double 双精度浮点数 -1.79E+308 ~ +1.79E+308,15位十进制有效数字。 -
ByteArray 字节数组 - 一般用于文件类型的数据存储,如图片、文档和视频等。在端侧时,使用Android开发应用时,以byte[]表示为字节数组。 采用 UTF-8 编码的字节顺序
Text 文本类型 - -
Date 日期类型 - - 时间顺序
IntAutoIncrement 自增类型,从1开始自增,Integer类型(四字节整型)。 1~ 2,147,483,647 Android、HarmonyOS(Java)和iOS不支持此数据类型。 数字顺序
LongAutoIncrement 自增类型,从1开始自增,Long类型(八字节整型)。 1~ 9,223,372,036,854,775,807 Android、HarmonyOS(Java)和iOS不支持此数据类型。 数字顺序

2、添加数据条目

创建完对象类型后,您可在对象类型内添加数据条目(DataEntry),并配置数据所在的存储区。

支持手动创建和自动生成数据条目文件。

2.1、手动创建数据条目文件

右击“clouddb/dataentry”目录,选择“New > Cloud DB Data Entry”。img

在“Associated Cloud DB Object Type”栏选择需添加数据条目的对象类型,在“Enter Cloud DB Data Entry Name”栏定义数据条目文件名,完成后点击“OK”。

img

img

注意:存储区最多就四个

2.2、自动生成数据条目文件

右击对象类型JSON文件,选择“Generate Data Entry”。

img

在弹出的“New Cloud DB Data Entry”框内,为即将生成的数据条目文件定义名称。

img

3、部署云数据库

完成数据条目创建后,您可以直接部署该数据条目。您也可以等所有对象类型和数据条目开发完成后,再统一批量部署到AGC云端。

说明

  • 部署到AGC云端的存储区数量不得超过4个,否则会导致部署失败,提示“clouddb deploy failed. Reason is the number of CloudDBZone exceeds the limit.”错误。如AGC云端当前已存在4个存储区,请将数据部署到已有的存储区,或者删除已有存储区后再部署新的存储区。需要注意的是,删除存储区,该存储区内的数据也将一并删除,且不可恢复。
  • 对象类型中的fieldType等字段信息,部署到AGC云端后,请勿在本地再做修改。例如,fieldType设置为String,对象类型部署成功后,又在本地修改fieldType为Integer,再次部署将失败,提示“clouddb deploy failed. Reason is existing fields cannot be modified.”错误。如需更改fieldType等字段信息,请先删除云端部署的对象类型。需要注意的是,删除云端对象类型,对象类型内添加的数据也将一并删除,且不可恢复。

右击“clouddb”目录,选择“Deploy Cloud DB”。

img

部署成功有提示

img

说明

云数据库部署成功后,DevEco Studio将自动从云侧下载云数据库的schema文件至“AppScope/resources/rawfile/schema.json”路径,该文件是云数据库端侧API必须引入的配置文件。

img

在打开的CloudDev面板中,点击“Serverless > Cloud DB”下的“Go to console”,进入当前项目的云数据库服务页面

img

img

img

4、在端侧访问云数据库

确保云数据库已正确开发并部署

4.1、生成Client Model

在云侧右击需要调用的对象类型文件(以“User.json”为例),选择“Generate Client Model”。

img

img

img

4.2、端侧在代码文件中引入Cloud Foundation Kit和“User”类。

import { cloudDatabase } from '@kit.CloudFoundationKit';
import { User } from './User';

4.3、调用云数据库

import { hilog } from '@kit.PerformanceAnalysisKit';
import { cloudDatabase } from '@kit.CloudFoundationKit';
import { User } from './User';

const TAG = '[CloudDBPage]';


@Entry
  @Component
  struct CloudDb {
    // 数据
    @State allRecords: User[] = [];
    // 查询agc里面云数据库的区域
    agcDataBase: cloudDatabase.DatabaseZone | undefined = undefined;
    // 查询条件
    condition: cloudDatabase.DatabaseQuery<cloudDatabase.DatabaseObject> | undefined = undefined;

    aboutToAppear() {
      // 设置查看区域
      this.agcDataBase = cloudDatabase.zone('default');
    }

    /**
   * 查询所有数据
   */
    async getAllData() {
      try {
        this.condition = new cloudDatabase.DatabaseQuery(User);
        const resultArray = await this.agcDataBase?.query(this.condition)
        this.allRecords = resultArray as User[]
        hilog.info(0x0000, 'CloudDB', 'query success : %{public}s', JSON.stringify(resultArray));
      } catch (err) {
        hilog.error(0x0000, 'CloudDB', 'query err %{public}s', JSON.stringify(err));
      }
    }

    /**
   * 删除数据
   * @param user
   */
    async deleteRecord(user: User) {
      try {
        // 删除数据,大家切记要有权限,创建对象类型的时候有设置权限
        const record = await this.agcDataBase?.delete(user)
        hilog.info(0x0000, 'CloudDB', 'delete success: %{public}d', record);
        // 查询所有数据
        this.getAllData()
      } catch (err) {
        hilog.error(0x0000, 'CloudDB', 'delete error: %{public}d', user);
      }
    }

    /**
   * 添加或者修改数据
   * @param user
   */
    async insertRecord(user: User) {
      try {
        // 添加数据,大家切记要有权限,创建对象类型的时候有设置权限
        await this.agcDataBase?.upsert(user)
        hilog.info(0x0000, 'CloudDB', 'insert success: %{public}d', user);
        // 查询所有数据
        this.getAllData()
      } catch (err) {
        hilog.error(0x0000, 'CloudDB', 'insert error: %{public}d', user);
      }
    }

    build() {
      Column() {
        Button('查询所有数据')
          .onClick(() => {
            this.getAllData()
          })
        List({space:20}) {
          ForEach(this.allRecords, (item: User) => {
            ListItem() {
              Row() {
                Text('id: ' + item.id.toString())
                  .fontSize(10)
                Text('username: ' + item.username)
                  .fontSize(10)
                Text('password: ' + item.password)
                  .fontSize(10)
                Text(item.sex === 0 ? '性别: 男' : '性别: 女')
                  .fontSize(10)
                Text('删除数据').fontColor(Color.Blue)
                  .fontSize(10)
                  .onClick(() => {
                    this.deleteRecord(item)
                  })
                Text('添加或者修改数据')
                  .fontColor(Color.Blue)
                  .fontSize(10)
                  .onClick(() => {
                    item.id = 1
                    item.username = ''
                    item.password='123456'
                    item.sex = 1
                    this.insertRecord(item)
                  })
              }.width('100%').justifyContent(FlexAlign.SpaceBetween)
            }
          })
        }

      }.width('100%')
        .height('100%')
    }
  }

注意:对象数据的操作需要权限的,如果报权限问题记得去云侧生成对象类型的时候修改下权限,然后在进行云侧数据库部署到agc

{
  "objectTypeName": "User",
    "fields": [
    {"fieldName": "id", "fieldType": "Integer", "notNull": true, "belongPrimaryKey": true},
    {"fieldName": "sex", "fieldType": "Integer", "notNull": true, "defaultValue": 0},
    {"fieldName": "username", "fieldType": "String"},
    {"fieldName": "password", "fieldType": "String"}
  ],
    "indexes": [
    {"indexName": "id_index", "indexList": [{"fieldName":"id","sortType":"ASC"}]}
  ],
    "permissions": [
    {
      "role": "World", "rights": ["Read", "Upsert", "Delete"]
    },
    {
      "role": "Authenticated", "rights": ["Read", "Upsert", "Delete"]
    },
    {
      "role": "Creator", "rights": ["Read", "Upsert", "Delete"]
    },
    {
      "role": "Administrator", "rights": ["Read", "Upsert", "Delete"]
    }
  ]
}

4.4、修改EntryAbility文件里面启动页面(方便测试)

注意:切记需要在真机上面测试,而且工程已经进行手动签名

img

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐