OpenHarmony3.1分布式应用开发 第一讲 分布式数据管理 原创 精华

un_garçon
发布于 2022-5-17 09:58
浏览
3收藏

OpenHarmony3.1分布式应用开发

第一讲 分布式数据管理

本次直播对应OpenHarmoy Gitee库中的内容是

docs/zh-cn/application-dev

下一次直播为

docs/zh-cn/application-dev/ability中的pageability与 serviceability

课程内容主要包括了3大块:

  1. DAYU200开发板的介绍
  2. AruUI介绍
  3. 分布式数据库开发

一)DY200开发板介绍

DAYU200开发板的开发过程中,可能会遇到如下问题,张老师给出了一些解决方法

1.开发板不能常亮

解决办法1:

hdc_std.exe工具 ,

显示开发板: hdc_std list targets

让开发板常亮:hdc_std -t id shell power-shell setmode 602

优点:操作简单,适合入门开发者

缺点:重启之后,需要重新使用这个命令

解决办法2:

修改openharmony的源代码

services\nativeprofile\power_mode_config.xml value值改成-1,并烧录

优点:一劳永逸,重启之后,不需要重复设置

缺点:对新手不友好

2.刷机

强烈建议3.1 release版本

每日构建中的openharmony会有一些bug,不够稳定

3.wifi连不上/分布式不好使

重启/重刷系统

4.分布式组网

设置->开发板连接到同一个wifi->系统内置应用音乐(提供分布式组网的能力)->点击按钮->可以查看已连接的分布式设备

能通过查看已连接的设备,来确认分布式组网是否成功

刚刷完机,组网,可以看官网的示例remoteStartFA

5.device_manager

用于账号无关的分布式设备的认证组网能力,提供了设备监听、认证等接口

codelabs中很多栗子如分布式手写版下面都会有这个文件 RemoteDeviceModel.js/ets
OpenHarmony3.1分布式应用开发  第一讲 分布式数据管理-鸿蒙开发者社区

此文件是对多个设备进行分布式组网、管理的文件

6.示例代码与Codelabs 的区别

示例代码:针对技术点的案例展示,代码量少,比较枯燥

Codelabs:针对具体的应用场景,代码相对完整,功能复杂

建议学习顺序:Samples->Codelabs

二)ArkUI介绍

1.ArkUI介绍

页面开发语言:Java/JS/ets

OpenHarmony不支持Java,HarmonyOS支持,为了方便应用开发后,两者之间的快速迁移,不建议使用Java进行应用开发

编写代码

1.基于JS扩展的类Web开发范式

2.基于TS扩展的声明式开发范式

建议使用声明式开发范式 ,它的好处是能够实时刷新

DevEco Studio的预览器可以实时预览开发板画面

操作如下:

  1. 下拉箭头->New Profile

    OpenHarmony3.1分布式应用开发  第一讲 分布式数据管理-鸿蒙开发者社区

  2. 指明宽度,高度,dpi

2.基于JS扩展的类Web开发范式介绍

html裁剪、扩展-> hml (huawei markdown language)

hml 页面结构,css描述组件长什么样,js 业务逻辑,ets页面结构、表现、逻辑都放在一个页面

3.基于TS扩展的声明式开发范式介绍

ets以声明式, 用于组件UI界面的描述

还有很多装饰器

@State的变量是页面内的状态数据,被修改就会刷新UI

4.ETS的特点:可以组合/可以重用/生命周期回调函数/数据驱动界面

  1. 一个自定义组件里面可以有多个组件

  2. 一个自定义组件可以被其他组件重用

  3. 生命周期回调函数,如aboutToAppear() 页面显示的时候,会调回调函数

    防止log被过度过滤选用No filter,使用正则表达式搜索

  4. 数据驱动UI界面

系统提供了一系列UI组件,提供了一系列接口

5.如何系统学习声明式开发范式:

基于TS扩展的声明式开发范式

OpenHarmony3.1分布式应用开发  第一讲 分布式数据管理-鸿蒙开发者社区

application-dev/ui 体验声明式UI

  1. docs/zh-cn/application-dev/ui目录下有 两栏,分别为 体验声明式UI与页面连接与布局
    OpenHarmony3.1分布式应用开发  第一讲 分布式数据管理-鸿蒙开发者社区

    开发者可根据这两栏的内容快速了解声明式UI如何创建,如何使用

  2. 了解声明式UI的框架与声明(与上一条在统一目录下)
    OpenHarmony3.1分布式应用开发  第一讲 分布式数据管理-鸿蒙开发者社区

  3. 使用系统提供的的组件来熟悉不同的组件以及不同组件的作用
    所在目录

在此目录拥有丰富的组件提供给开发者学习使用
OpenHarmony3.1分布式应用开发  第一讲 分布式数据管理-鸿蒙开发者社区

  1. Samples & Codelabs

ETS Codelabs目录

其中,第一个小括号为eTS的为声明式范式开发
OpenHarmony3.1分布式应用开发  第一讲 分布式数据管理-鸿蒙开发者社区

ETS-UI示例目录

OpenHarmony3.1分布式应用开发  第一讲 分布式数据管理-鸿蒙开发者社区

分布式数据库网站:https://gitee.com/openharmony/app_samples/tree/master/data/Kvstore

三)分布式数据库

代码来源于张荣超老师

是否加密

是否备份

是否自动同步

单版本数据库

1.创建KVManager

Button('创建KVManager')
  .width(500)
  .height(80)
  .fontSize(50)
  .align(Alignment.Center)
  .backgroundColor('#AD9D8F')
  .fontColor('#FFFFFF')
  .borderRadius(10)
  .onClick((event: ClickEvent) => {
    try {
      const kvManagerConfig = {
        bundleName: 'com.example.myfirstapp',
        userInfo: {
          userId: '0',
          userType: distributedData.UserType.SAME_USER_ID
        }
      }

      distributedData.createKVManager(kvManagerConfig, function (err, manager) {
        if (err) {
          console.info("createKVManager err:" + JSON.stringify(err));
          return;
        }
        console.info("xxxxxx---createKvManager success");
        kvManager = manager;
      });
    } catch (e) {
      console.info("xxxxxx--- An unexpected error occurred. Error:" + e);
    }
  })
需在文件头声明
import distributedData from '@ohos.data.distributedData';

2.获取/创建KVStore

            Button('获取/创建KVStore')
                .width(500)
                .height(80)
                .fontSize(50)
                .align(Alignment.Center)
                .backgroundColor('#AD9D8F')
                .fontColor('#FFFFFF')
                .borderRadius(10)
                .onClick((event: ClickEvent) => {
                    try {
                        const options = {
                            createIfMissing: true,  //丢失了是否创建
                            encrypt: false,         //是否加密
                            backup: false,          //是否备份
                            autoSync: false,        //是否自动同步
                            kvStoreType: distributedData.KVStoreType.SINGLE_VERSION,//单版本数据库
                            securityLevel: distributedData.SecurityLevel.S0//安全等级低一点比较好,等级越高,限制越多
                        };

                        kvManager.getKVStore('storeId332423423', options).then((store) => {
                            console.info("xxxxxx---create/getKVStore success");
                            kvStore = store;
                        });
                    } catch (e) {
                        console.info("xxxxxx---An unexpected error occurred. Error: " + e);
                    }
                })

3.订阅分布式数据的变化

想要达到的效果:左边的设备修改,右边的设备有变化

Button('订阅分布式数据变化')
    .width(500)
    .height(80)
    .fontSize(50)
    .align(Alignment.Center)
    .backgroundColor('#AD9D8F')
    .fontColor('#FFFFFF')
    .borderRadius(10)
    .onClick((event: ClickEvent) => {
        kvStore.on('dataChange', distributedData.SubscribeType.SUBSCRIBE_TYPE_ALL,//分布式数据库订阅类型为全部
            function (data) {
                console.info("xxxxxx---dataChange:" + JSON.stringify(data));
            });
        console.info("xxxxxx---subscribe success");
    })

分布式数据库订阅类型:

  1. 本地
  2. 远程设备
  3. All

4.写入数据

Button('写入数据1')
  .width(500)
  .height(80)
  .fontSize(50)
  .align(Alignment.Center)
  .backgroundColor('#AD9D8F')
  .fontColor('#FFFFFF')
  .borderRadius(10)
  .onClick((event: ClickEvent) => {
    kvStore.put(this.key + 1, this.value + 1, function (err, data) {
      if (err != undefined) { //没成功
        console.info("xxxxxx---put error:" + JSON.stringify(err));
        return;
      }
      console.info("xxxxxx---put success, data: " + this.value + 1);
    })
  })

5.读取数据

Button('读取数据1')
	.width(500)
    .height(80)
    .fontSize(50)
    .align(Alignment.Center)
    .backgroundColor('#AD9D8F')
    .fontColor('#FFFFFF')
    .borderRadius(10)
    .onClick((event: ClickEvent) => {
    	kvStore.get(this.key + 1, function (err, data) {
            console.info("xxxxxx---get success, data: " + data);
        })
     })

6.手动同步数据

Button('手动同步数据')
        .width(500)
        .height(80)
        .fontSize(50)
        .align(Alignment.Center)
        .backgroundColor('#AD9D8F')
        .fontColor('#FFFFFF')
        .borderRadius(10)
        .onClick((event: ClickEvent) => {
          deviceManager.createDeviceManager("com.example.myfirstapp", (err, value) => {
            if (!err) {
              let devManager = value;
              let deviceList = devManager.getTrustedDeviceListSync();
              let deviceIds = [];
              for (let i = 0; i < deviceList.length; i++) {
                deviceIds[i] = deviceList[i].deviceId;
              }
              console.info("xxxxxx---deviceIds" + deviceIds);
              try {
                kvStore.sync(deviceIds, distributedData.SyncMode.PUSH_PULL, 1000);//同步方式为推送并拉取数据
              } catch (e) {
                console.info("An unexpected error occurred. Error: " + e);
              }
            }
          })
        })

需在文件头声明
import deviceManager from '@ohos.distributedHardware.deviceManager';

数据更新包括:插入/更新/删除

数据手动同步:

同步方式:

  1. PUSH_ONLY 只推送
  2. PULL_ONLY 拉取数据
  3. PUSH_PULL 推送并拉

7.分布式数据对象

  1. HarmonyOS没有

    分布式数据需要持久化,分布式数据对象不需要

  2. 分布式数据对象存在内存中

  3. 没有手动同步,会自动同步

    创建分布式数据对象,A,B创建了,只要sessionId一样,数据就会自动同步

  4. 如何使两个对象的sessionId一致?

​ sessionId是8个字符的字符串,可以获取A的sessionId,然后设置B的sessionId,就可以自动同步数据!

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2022-7-23 09:58:46修改
4
收藏 3
回复
举报
4条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

感谢大佬整理分享!

回复
2022-5-17 14:22:15
离北况归
离北况归

nice

回复
2022-5-22 21:10:29
离北况归
离北况归

感谢分享

 

回复
2022-5-22 21:10:39
入门大师小波哥
入门大师小波哥

nice

回复
2022-5-22 22:52:42
回复
    相关推荐