【笔记·直播】OpenHarmony 3.1 分布式应用开发之分布式数据管理 原创

曹志翔
发布于 2022-5-15 00:57
浏览
0收藏

@toc
$\color {#aaa} {说明:}$
$\color {#aaa} {因为习惯用 OneNote 写笔记。为确保格式不变,直接作为图片贴上来。}$
$\color {#aaa} {如果有需要复制链接或代码的,在文末有纯文字版。}$
$\color {#aaa} {也可以私信我要 OneNote 格式和 Word 格式的文件。}$

DAYU200

【笔记·直播】OpenHarmony 3.1 分布式应用开发之分布式数据管理-鸿蒙开发者社区

分布式联网步骤、代码仓、示例代码

【笔记·直播】OpenHarmony 3.1 分布式应用开发之分布式数据管理-鸿蒙开发者社区

ArkUI

【笔记·直播】OpenHarmony 3.1 分布式应用开发之分布式数据管理-鸿蒙开发者社区

分布式数据服务

【笔记·直播】OpenHarmony 3.1 分布式应用开发之分布式数据管理-鸿蒙开发者社区

问答

【笔记·直播】OpenHarmony 3.1 分布式应用开发之分布式数据管理-鸿蒙开发者社区


纯文字版
小班课·第一阶段 OpenHarmony 3.1 分布式应用开发之分布式数据管理
DAYU200
架设环境
可以接鼠标。就不用手戳来戳去了。
开发板常亮
a. hdc_std.exe
位置:
找到 SDK路径:菜单栏 file -> settings,OpenHarmony SDK,SDK 路径
3.1.5.5 目录下。
目录 hdc_std list targets
hdc_std -t 设备ID shell power-shell setmode 602
缺点: 重启后需要再次执行。
b. 修改 OH 源代码
代码位置:base\powermgr\power_manager\services\native\profile\power_mode_config.xml
优点:一劳永逸
刷机 tips:
3.1 release 版本,比较稳定。
最新版。已经支持浏览器。
刷最新代码,URL: http://ci.openharmony.cn/dailys/dailybuilds
刷机经验:WiFi连不上,或分布式不好使。重启,或重新刷机。

预览器,配置大禹200
	写好页面,可以通过预览器预览效果。预览器可以完成大部分效果,但是部分功能只能用真机。
	预览器可以配置大禹200。
		预览器,New Profile, 设备类型 平板Tablet,width 1920, height 1080, dpi 240
		另一款开发板的配置,设备类型 平板Tablet,width 1280, height 720, dpi 240

分布式联网步骤
OpenHarmony 应用开发文档: https://gitee.com/openharmony/docs/tree/master/zh-cn/application-dev
(详情参见《官网示例,启动远程的 FA》) https://gitee.com/openharmony/codelabs/tree/master/Distributed/RemoteStartFA
1. 设置两个开发板连接到同一个WiFi。
2. 音乐APP,左下角按钮,显示同网络所有设备。
3. 输入PIN码。
分布式代码仓
https://gitee.com/openharmony/device_manager
示例代码
https://gitee.com/openharmony/codelabs/blob/master/README.md
Samples 针对技术点,小
Code Labs 相对完整,有场景,复杂

分布式示例代码
https://gitee.com/openharmony/app_samples/blob/master/ability/JsDistributedMusicPlayer/entry/src/main/js/model/RemoteDeviceModel.js
https://gitee.com/openharmony/codelabs/blob/master/Distributed/DistributeDatabaseDrawEts/entry/src/main/ets/MainAbility/model/RemoteDeviceModel.ts

OpenHarmony 3.1 有很大增强,但还有很大差距。930上一个台阶。有很多坑。

ArkUI
OpenHarmony 只支持 JS 和 eTS,不支持 Java。
建议声明式 eTS。

Hello World
	DevEco Studio (OpenHarmony)
	创建新项目
		模板 empty,项目类型 Application。eTS。手机、平板
	预览器,配置大禹200
	ets文件,合并 HML CSS TS 到一个文件里。
	组件,声明式方式
自定义组件
	@Component 的 struct
	build() 中描述组件
	@State:组件内部状态数据。数据改变,界面绑定 state 的地方自动刷新。
	Column(),一种容器,内部组件竖直排列。
	可组合
	可重用。在其它组件内部使用。
	生命周期函数
		aboutToAppear(), 页面即将显示。
内置组件
	Divider
	Button
通过日志调试
	预览器不能打印 log。需要真机运行。
	在真机上运行APP前,一定要签名。
	【坑】Show NAGS Log 会过滤掉有用的 Log。选 No filter。
	同时看两个设备的log,+ 创建新的 Log。
学习路径
	a. 文档,API参考 -> 基于TS扩展的什么式,UI开发 体验声明式UI,页面布局与连接(健康饮食APP示例)
	b. 框架和声明。
	c. 系统组件。
	d. Samples、Code Labs。

分布式数据服务
官方文档:数据管理,分布式数据服务, https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/database/Readme-CN.md
单版本分布式数据库
https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/database/database-mdds-overview.md

	import distributedData from '@ohos.data.distributedData';
	let kvManager = null;  // 保存 manager 的全局变量
	let kvStore = null;
	try {
		const kvManageConfig = {
			bundleName: 'xxx',
			userInfo: {
				userId: '0',
				userType: distributedData.UserType.SAME_USER_ID
			}
		};
		distributedData.createKVManager(kvManageConfig, function(error, manager) {
			// 判断是否出错
			if (error) {
				console.error('Fail to create KV manager', error);
				return;
			}
			// manager 保存到全局变量
			kvManager = manager
		});
	} catch (error) {
		console.error('Fail to create KV manager', error);
	}
	
	try {
		const options = {
			createIfMissing: true,
			encrypt: false,
			backup: false,
			autoSync: true,  // 自动同步。
			kvStoreType: distributedData.KVStoreType.SINGLE_VERSION,
			securerityLevel: distributedData.SecurityLevel.S0,  // 【坑】,官方文档设置S2,安全等级太高无法同步。应该设置为S0。
		};
		
		kvManager.getKVStore('storeId', options)  // 每次实验,使用不同的 ID,避免缓存造成影响。
			.then(store => {
				kvStore = store;
			})
	} catch (error) {
		console.error('Fail to get KV store', error);
	}
	
	// 订阅分布式数据变化
	kvStore.on('dataChange', distibutedData.SubscribeType.SUBSCRIBE_TYPE_ALL, function (data) {
		// 数据变化
		// data 是新数据?
		// 是否能取到旧数据?
	});  // ALL 指定义本地,也定义远程。
	
	// 改变分布式数据
	kvStore.put(key, value)
	
	// 手动同步数据
	options.autoSync = false;
	// 指定同步到哪个设备上
	// 首先获取所有组网设备的 ID。
	import deviceManager from '@ohos.distributedHardware.deviceManager';
	deviceManager.createDeviceManager('bundleName', (error, deviceManager) => {
		if (error) {
			return;
		}
		let deviceList = deviceManager.getTrustedDeviceListSync();
		let deviceIds = deviceManager.map(device => device.id);
	})
	// 手动同步
	try {
		kvStore.sync(deviceIds, distributedData.SyncMode.PUSH_PULL, 1000);  // PUSH_PULL, PUSH_ONLY, PULL_ONLY。1000 是超时毫秒数。
	} catch (error) {
	}
分布式数据对象
	https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/database/database-distributedobject-overview.md
	
	HarmonyOS 文档里没有。也不知道是否支持。
	OpenHarmony 3.1 的新技术。
	缓存在内存中。
	如何自动同步:设置 sessionId。sessionId一样,就会自动同步。sessionId 是 8位字符串。写死sessionId,而不是通过API生成。
	效率高
	支持复杂类型。

问题
1. OpenHarmony 的签名怎么做? 和 HarmonyOS 一样吗?
2. 关键还是没有开发板和模拟器。分布式数据库,能不能在没有界面的程序里用,然后用2块小熊派做实验?
张荣超老师:是标准系统的,不能在小熊派。DAYU200 和 Hi 3516。DAYU200
张荣超老师:9月30号发布的版本,可能会有分布式模拟器。
张荣超老师:目前,可以在 HarmonyOS 的分布式模拟器里实验。
3. 分布式数据库里的值,能不能和 ArkUI 自定义组件的 State 绑定,自动更新?自定义组件的 state 能不能设置成分布式数据对象?
张荣超老师:【坑】设备A数据发生变化,设备B刷新界面需要 bind(this)
https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/database/database-distributedobject-guidelines.md

4. 能不能监听分布式数据库中新加入的 key?比如,我想做个应用,在另外一个设备上显示分布式数据库里,所有的 key 和 value。那么,另一个设备需要知道新加入了一个 key。新加入的 key,是指不能提前知道 id 的,新的key。
张荣超老师:可以。insert  update  delete
5. 不同应用的分布式数据库是怎么区分的? 难道组网的2个设备,B设备能监听A设备上所有应用的分布式数据库吗?
张荣超老师:通过 storeId 区分。
进一步问题:
	a. 是不是知道了别人APP的 bundleName 和 storeId,就可以读取本地设备和远端设备上,别人APP的分布式数据库的值了?
	张荣超老师:需要通过组网授权,才能访问。
	b. 如果确实需要读取其它应用的分布式数据库,如何做?比如,瘦设备上只有传感器,负责写入值到分布式数据库;富设备有屏幕,负责读取分布式数据库的值并显示。2个设备的程序,代码不一样,但需要使用同一个分布式数据库。
	相同的 storeId 即可。
	实验一下。
6. 一个 OpenHarmony 应用和 另一个HarmonyOS 应用,能不能用同一个分布式数据库?
张荣超老师:不行。

其它同学的问题
1. openharmony 和 HarmonyOS 差别
张荣超老师:330 分开的,以后会合并。没有差别。
2. 可以存MP3吗
张荣超老师:不建议。参考官方文档,分布式数据库的限制。
未解答的问题:
1. HarmonyOS 应用 和 OpenHarmony 应用交互数据,有什么方案呢?

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2022-5-15 00:57:58修改
2
收藏
回复
举报
1条回复
按时间正序
/
按时间倒序
longlong899
longlong899

感谢总结!!

回复
2022-5-16 15:21:11
回复
    相关推荐