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

2、端云一体化架构

3、端云一体化开发特性

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

4、工作原理
DevEco Studio支持开发者在本地完成云侧服务资源的开发与部署,并可在端侧工程中调用您开发的云侧代码,真正实现端云一体化开发。
-
选择合适的云开发模板,根据工程向导创建端云一体化开发工程。
-
分别进行云侧工程与端侧工程的代码开发与调试。
-
- 开发云侧工程:在云侧工程开发Cloud Foundation Kit提供的云端服务,目前包括云函数、云对象和云数据库资源开发。
-
-
- 开发云函数:在DevEco Studio中创建并配置函数、开发函数代码、调试函数、部署函数到AGC云端。
- 开发云对象:在DevEco Studio中创建云对象、开发云对象代码、调试云对象、部署云对象到AGC云端。
- 开发云数据库:在DevEco Studio中创建对象类型、在对象类型中添加数据条目、部署云数据库到AGC云端。
-
-
- 部署云侧工程:云侧工程代码全部开发调试完毕后,一键部署云侧工程到AGC云端。
- 开发端侧工程:在端侧工程下开发您应用的业务代码。本文档仅描述如何在端侧调用您开发的云侧代码,包括调用云函数、调用云对象、访问云数据库、调用云存储。
-
端云两侧工程代码全部开发完成后,将端云一体化工程打包成APP,提交至AGC申请上架。

说明
云侧与端侧工程的代码可并行开发,一般无先后顺序。但若需在端侧代码中调用云侧代码,云侧代码必须先部署到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#/

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

6.3、创建项目


点击完成即可创建,下面教大家如何创建应用
6.4、打开下面图片所选中区域

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

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


点击确认即可创建完成
6.6、最后大家点击我的项目里面可以查看到应用

6.7、配置数据处理位置

二、开发端云工程
注意:仅支持手机,且不支持使用模拟器运行调试,必须要手动签名
1、创建鸿蒙端云一体化应用工程
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/agc-harmonyos-clouddev-overview
1.1、新建工程
在菜单栏选择“File > New > Create Project”来创建一个新工程。

1.2、选择模板
在“Application”页签,选择合适的云开发模板,然后点击“Next”
说明
当前仅支持通用云开发模板([CloudDev]Empty Ability)。

1.3、配置工程信息

| 参数 | 说明 |
|---|---|
| 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、关联云开发资源

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

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

大家选中对应需要关联得云开发的应用,然后点击finish
1.5、进入主开发界面
进入主开发界面,DevEco Studio执行工程同步操作,端侧执行“ohpm install”,云侧执行“npm install”,分别下载端侧和云侧依赖。

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”下包含了云存储、云数据库和云函数页面。

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

三、开发云函数
云函数开发指南: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”。


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


其他详细配置参考官方文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/agc-harmonyos-clouddev-createfunc-V5
云函数和云对象区别:
云对象是一种特殊的云函数,本质是对云函数的一种封装,客户端可通过导入一个云对象来直接使用这个对象的方法,为您提供在端侧直接调用云侧代码的开发体验。相对普通云函数方式,云对象代码更精简、逻辑更清晰,大多数场景下推荐使用云对象代替传统云函数
2.2、开发函数
打开函数入口文件myFunction.ts

注意
云函数与云函数之间是相互独立的,部署至云侧时,只会部署所选云函数目录下的文件,不可在一个云函数中通过import '…/anotherDirectory/xxx’的方式引入依赖。如果有多个云函数公共的配置,建议存储在云数据库中,通过云数据库Server API类查询出公共配置;也可以将多个云函数整合成一个云对象,将公共配置变成云对象的私有配置。
2.3、调试函数
本地调用
在DevEco Studio调试本地开发好的函数。支持单个调试和批量调试,并支持Run和Debug两种模式,调试功能丰富,常在函数开发过程或问题定位过程中使用

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

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

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

点击“Trigger”, 将会触发执行用户函数代码。执行结果将展示在“Result”框内,“cloudfunctions”窗口同时打印调试日志。
通过远程调用方式调试函数
您还可以将函数部署至AGC云端,然后在DevEco Studio调用云端函数,以测试函数在云端的运行情况、或补充测试因各种因素限制未能在本地调试中发现的问题。

2.4、部署函数
完成函数代码开发后,您可将函数部署到AGC云端,支持单个部署和批量部署。
单个部署,直接右击需部署的函数目录,选择“Deploy ‘函数名’”即可,后续流程与批量部署相同。

您可在底部状态栏右侧查看函数打包与部署进度。
请您耐心等待,直至出现“Deploy successfully”消息,表示所有函数均已成功部署。

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


鼠标右击


其他步骤和单个部署一样
2.5、在端侧调用云函数
先确保云函数正确开发并部署在AGC上
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)
});
}
注意:切记需要在真机上面测试,而且工程已经进行手动签名

四、开发云数据库
云数据库开发指南:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/cloudfoundation-arkts-api
1、创建对象类型
对象类型(ObjectType)用于定义存储对象的集合,不同的对象类型对应的不同数据结构。每创建一个对象类型,云数据库会在每个存储区实例化一个与之结构相对应的对象类型,用于存储对应的数据。
右击“clouddb/objecttype”目录,选择“New > Cloud DB Object Type”。


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


注意:存储区最多就四个
2.2、自动生成数据条目文件
右击对象类型JSON文件,选择“Generate Data Entry”。

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

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”。

部署成功有提示

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

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



4、在端侧访问云数据库
确保云数据库已正确开发并部署
4.1、生成Client Model
在云侧右击需要调用的对象类型文件(以“User.json”为例),选择“Generate Client Model”。



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文件里面启动页面(方便测试)
注意:切记需要在真机上面测试,而且工程已经进行手动签名

更多推荐




所有评论(0)