写点什么

HarmonyOS Next 端云一体化(3)

作者:万少
  • 2025-01-17
    广东
  • 本文字数:3253 字

    阅读完需:约 11 分钟

HarmonyOS Next 端云一体化(3)

HarmonyOS Next 端云一体化(3)

上一章我们主要讲解了如何新建数据库、新建数据表已经部署数据库。这一章主要学习如何对数据库、数据表进行 CRUD 的操作。

操作数据库的方式

我们操作数据库的方式一共有 4 种。


  1. 可视化 - AGC 平台上直接编辑数据

  2. 可视化 - DevEco Studio 中直接编辑数据

  3. 编程 - 客户端通过代码的方式操作数据

  4. 编程 - 云函数通过代码的方式操作数据


方式 1、2 都是为了让开发人员简单、方便管理数据。但是实际的业务场景中,我们更多要关注的是 3、4 的方式。那么本章主要讲的是 方式 3-客户端通过代码的方式操作数据 。后续再讲到云函数的时候再来补充方式 4。

生成客户端-数据模型

先解释下这个功能是做什么的。因为我们的目标是要在 客户端来查询数据库的数据,那必不可少需要在客户端中定义数据表实体的类型。然后 DevEco Studio 提供了比较便捷的根据数据实体生成客户端-数据模型。



我这里红色的提示是因为我之前已经生成过了,所以提示是否覆盖。


成功后边得到如下内容:entry/src/main/ets/common/types/Book.ts


/* * Copyright (c) Huawei Technologies Co., Ltd. 2024-2024. All rights reserved. * Generated by the CloudDB ObjectType compiler. DO NOT EDIT! */import { cloudDatabase } from "@kit.CloudFoundationKit";
class Book extends cloudDatabase.DatabaseObject { id: number; name: string; price: number; publish: Date; hot: boolean; cover: string;
naturalbase_ClassName(): string { return "Book"; }}
export { Book };
复制代码

简单使用

接下来我们就可以进入客户端查询数据库的步骤了。


  1. 首先我们需要创建一个数据库示例,每一个存储区就是一个数据库 cloudDatabase.DatabaseZone

  2. 然后指定查询条件,比如全部查询、查询 id 等于 1 等等 condition

  3. 进行查询,接收返回的数据


import { cloudDatabase } from '@kit.CloudFoundationKit';import { Book } from '../common/types/Book';import { promptAction } from '@kit.ArkUI';
@Entry@Componentstruct PageDB { // 数据库实例,初始化时为 undefined agcDataBase: cloudDatabase.DatabaseZone | undefined = undefined; // 查询条件实例,初始化时为 undefined condition: cloudDatabase.DatabaseQuery<cloudDatabase.DatabaseObject> | undefined = undefined; // 初始化数据库连接的方法 fn1 = () => { this.agcDataBase = cloudDatabase.zone('Study'); promptAction.showToast({ message: `初始化成功` }); } // 查询数据库的方法 fn2 = async () => { try { // 创建查询条件实例 this.condition = new cloudDatabase.DatabaseQuery(Book); // 设置查询结果的最大数量为 10 this.condition.limit(10); // 执行查询并获取结果 const resultArray = await this.agcDataBase?.query(this.condition); // 显示查询结果 AlertDialog.show({ message: JSON.stringify(resultArray, null, 2) }); } catch (e) { promptAction.showToast({ message: `${e.message} ${e.code}` }); console.error(e.message, e.code); } }
build() { Column({ space: 10 }) { Button("初始化1") .onClick(this.fn1)
Button("查询2") .onClick(this.fn2) } .height('100%') .width('100%') }}
复制代码


对数据表的操作

端云一体提供了基本的对数据表的操作。主要分成以下几种


query

就是查询,上面的示例中已经使用过了。

upsert - 新增

现在主要演示 使用 upsert 实现新增


upsert 方法可以接收一个或者多个数据实体。如果该数据之前不存在,这时的 upsert 表示新增,反之表示更新。


操作成功后,会返回成功影响了的数据的数量。


比如新增:


fn3 = async () => {  try {    const book = new Book();    book.id = parseInt(Date.now().toString().slice(0, 6)); // 正常应该是自增的,但是这个自增会出bug    book.name = "book";    book.price = 99;    book.publish = new Date();    book.hot = true;    book.cover = "xxxx";    const res = await this.agcDataBase?.upsert(book);    AlertDialog.show({ message: `新增成了${res}条` });  } catch (e) {    promptAction.showToast({ message: `${e.message} ${e.code}` });    console.error(e.message, e.code);  }};
Button("新增3").onClick(this.fn3);
复制代码



需要注意的是:我们当前的角色是 World,此时是没有 新增、编辑、删除权限的。所以为了方便操作,可以修改调整权限


clouddb/objecttype/Book.json


    {      "role": "World",      "rights": [        "Read",        "Upsert",        "Delete"      ]    },
复制代码


当数据表信息发生了修改时,需要在 AGC 平台上删除之前的数据区+数据表。然后重新部署。

upsert - 编辑

这里我们可以根据 id 来编辑一下数据。 数据库里面存放着 id:10 的数据,我们就来修改它。



fn4 = async () => {  try {    const book = new Book();    //  固定修改id为10的数据    book.id = 10;    book.name = "更新book";    book.price = 999;    book.publish = new Date();    book.hot = true;    book.cover = "更新 xxxx";
const res = await this.agcDataBase?.upsert(book); // 因为数据 id已经存在,所以此时是编辑 AlertDialog.show({ message: `编辑成功${res}条` }); } catch (e) { promptAction.showToast({ message: `${e.message} ${e.code}` }); console.error(e.message, e.code); }};
Button("更新4").onClick(this.fn4);
复制代码

delete - 删除

执行删除 delete 方法时,也是需要传入一个或者多个删除的元素。


我们这里就可以根据 id:10 的元素执行删除。


fn5 = async () => {  try {    const book = new Book();    //  固定修改id为10的数据    book.id = 10;    const res = await this.agcDataBase?.delete(book); // 因为数据 id已经存在,所以此时是编辑    AlertDialog.show({ message: `删除成功${res}条` });  } catch (e) {    promptAction.showToast({ message: `${e.message} ${e.code}` });    console.error(e.message, e.code);  }};
Button("删除5").onClick(this.fn5);
复制代码

calculateQuery - 计算

calculateQuery 从数据库中查询符合条件的数据,并对指定字段进行算术计算。主要提供了以下的计算功能。




fn6 = async () => {  try {    // 创建查询条件实例    this.condition = new cloudDatabase.DatabaseQuery(Book);    // 设置查询结果的最大数量为 10    this.condition.limit(10);    // 执行查询并获取结果    const resultArray = await this.agcDataBase?.calculateQuery(      this.condition,      "price",      cloudDatabase.QueryCalculate.SUM    );    // 显示查询结果    AlertDialog.show({ message: JSON.stringify(resultArray, null, 2) });  } catch (e) {    promptAction.showToast({ message: `${e.message} ${e.code}` });    console.error(e.message, e.code);  }};
Button("计算6 总价格").onClick(this.fn6);
复制代码

总结

本章主要介绍了在 HarmonyOS Next 中如何通过客户端代码操作云数据库,主要包含以下几个要点:


  1. 操作数据库的四种方式,重点介绍了客户端代码操作方式

  2. 使用 DevEco Studio 自动生成客户端数据模型,简化开发流程

  3. 详细讲解了数据库的基本操作:

  4. 初始化数据库连接(DatabaseZone)

  5. 查询数据(query)

  6. 新增/更新数据(upsert)

  7. 删除数据(delete)

  8. 数据计算(calculateQuery)

  9. 介绍了各种操作的参数说明和返回值,并提供了完整的示例代码


以上是对客户端操作数据库的基本功能演示。下一章会重点来讲解查询语法。condition




如果你兴趣想要了解更多的鸿蒙应用开发细节和最新资讯,欢迎在评论区留言或者私信或者看我个人信息,可以加入技术交流群。


发布于: 刚刚阅读数: 4
用户头像

万少

关注

还未添加个人签名 2021-12-02 加入

还未添加个人简介

评论

发布
暂无评论
HarmonyOS Next 端云一体化(3)_HarmonyOS NEXT_万少_InfoQ写作社区