OpenHarmony3.1分布式应用开发 第一讲 分布式数据管理 原创 精华
OpenHarmony3.1分布式应用开发
第一讲 分布式数据管理
本次直播对应OpenHarmoy Gitee库中的内容是
下一次直播为
docs/zh-cn/application-dev/ability中的pageability与 serviceability
课程内容主要包括了3大块:
- DAYU200开发板的介绍
- AruUI介绍
- 分布式数据库开发
一)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
此文件是对多个设备进行分布式组网、管理的文件
6.示例代码与Codelabs 的区别
示例代码:针对技术点的案例展示,代码量少,比较枯燥
Codelabs:针对具体的应用场景,代码相对完整,功能复杂
建议学习顺序:Samples->Codelabs
二)ArkUI介绍
1.ArkUI介绍
页面开发语言:Java/JS/ets
OpenHarmony不支持Java,HarmonyOS支持,为了方便应用开发后,两者之间的快速迁移,不建议使用Java进行应用开发
编写代码
1.基于JS扩展的类Web开发范式
2.基于TS扩展的声明式开发范式
建议使用声明式开发范式 ,它的好处是能够实时刷新
DevEco Studio的预览器可以实时预览开发板画面
操作如下:
-
下拉箭头->New Profile
-
指明宽度,高度,dpi
2.基于JS扩展的类Web开发范式介绍
html裁剪、扩展-> hml (huawei markdown language)
hml 页面结构,css描述组件长什么样,js 业务逻辑,ets页面结构、表现、逻辑都放在一个页面
3.基于TS扩展的声明式开发范式介绍
ets以声明式, 用于组件UI界面的描述
还有很多装饰器
@State的变量是页面内的状态数据,被修改就会刷新UI
4.ETS的特点:可以组合/可以重用/生命周期回调函数/数据驱动界面
-
一个自定义组件里面可以有多个组件
-
一个自定义组件可以被其他组件重用
-
生命周期回调函数,如aboutToAppear() 页面显示的时候,会调回调函数
防止log被过度过滤选用No filter,使用正则表达式搜索
-
数据驱动UI界面
系统提供了一系列UI组件,提供了一系列接口
5.如何系统学习声明式开发范式:
基于TS扩展的声明式开发范式
application-dev/ui 体验声明式UI
-
在docs/zh-cn/application-dev/ui目录下有 两栏,分别为 体验声明式UI与页面连接与布局
开发者可根据这两栏的内容快速了解声明式UI如何创建,如何使用
-
了解声明式UI的框架与声明(与上一条在统一目录下)
在此目录拥有丰富的组件提供给开发者学习使用
- Samples & Codelabs
其中,第一个小括号为eTS的为声明式范式开发
分布式数据库网站: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");
})
分布式数据库订阅类型:
- 本地
- 远程设备
- 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';
数据更新包括:插入/更新/删除
数据手动同步:
同步方式:
- PUSH_ONLY 只推送
- PULL_ONLY 拉取数据
- PUSH_PULL 推送并拉
7.分布式数据对象
-
HarmonyOS没有
分布式数据需要持久化,分布式数据对象不需要
-
分布式数据对象存在内存中
-
没有手动同步,会自动同步
创建分布式数据对象,A,B创建了,只要sessionId一样,数据就会自动同步
-
如何使两个对象的sessionId一致?
sessionId是8个字符的字符串,可以获取A的sessionId,然后设置B的sessionId,就可以自动同步数据!
感谢大佬整理分享!
nice
感谢分享
nice