HarmonyOS NEXT 应用元服务开发-分布式数据对象迁移数据权限与基础数据
踏入鸿蒙世界的敲门砖,标志着您在技术征途上的全新起点,提升就业竞争力,获得行业认可,点亮职业成长先机,快人一步抢占未来应用开发赛道!https://developer.huawei.com/consumer/cn/training/dev-cert-detail/101666948302721398?ha_source=hmosclass-itzhijia&ha_sourceId=89000249
使用分布式数据对象迁移数据,当需要迁移的数据较大(100KB 以上)或需要迁移文件时,可以使用分布式数据对象。原理与接口说明详见分布式数据对象跨设备数据同步。
说明:自 API 12 起,由于直接使用跨设备文件访问实现文件的迁移,难以获取文件同步完成的时间。为了保证更高的成功率,文件的迁移不建议继续通过该方式实现,推荐使用分布式数据对象携带资产的方式。开发者此前通过跨设备文件访问实现的文件迁移依然生效。
一、申请权限
说明,自 API 12 起,无需申请 ohos.permission.DISTRIBUTED_DATASYNC 权限。
API 11 及以前版本,需要执行如下操作。
1.声明 ohos.permission.DISTRIBUTED_DATASYNC 权限。
2.由于 ohos.permission.DISTRIBUTED_DATASYNC 权限需要用户授权,应用需在首次启动、或进入接续页面时弹窗向用户申请授权。
二、基础数据迁移
使用分布式数据对象,与上述开发步骤类似,需要在源端 onContinue () 接口中进行数据保存,并在对端的 onCreate ()/onNewWant () 接口中进行数据恢复。
在源端 UIAbility 的 onContinue () 接口中创建分布式数据对象并保存数据,执行流程如下:
在 onContinue () 接口中使用 create () 接口创建分布式数据对象,将所要迁移的数据填充到分布式数据对象数据中。
调用 genSessionId () 接口生成数据对象组网 id,并使用该 id 调用 setSessionId () 加入组网,激活分布式数据对象。
使用 save () 接口将已激活的分布式数据对象持久化,确保源端退出后对端依然可以获取到数据。
将生成的 sessionId 通过 want 传递到对端,供对端激活同步使用。
说明,分布式数据对象需要先激活,再持久化,因此必须在调用 setSessionId () 后再调用 save () 接口。对于源端迁移后需要退出的应用,为了防止数据未保存完成应用就退出,应采用 await 的方式等待 save () 接口执行完毕。从 API 12 起,onContinue () 接口提供了 async 版本供该场景使用。
当前,wantParams 中“sessionId”字段在迁移流程中被系统占用,建议开发者在 wantParams 中定义其他 key 值存储该分布式数据对象生成的 id,避免数据异常。
示例代码如下:
在对端 UIAbility 的 onCreate ()/onNewWant () 中,通过加入与源端一致的分布式数据对象组网进行数据恢复。
创建空的分布式数据对象,用于接收恢复的数据;
从 want 中读取分布式数据对象组网 id;
注册 on () 接口监听数据变更。在收到 status 为 restore 的事件的回调中,实现数据恢复完毕时需要进行的业务操作。
调用 setSessionId () 加入组网,激活分布式数据对象。
说明,对端加入组网的分布式数据对象不能为临时变量,因为在分布式数据对象 on () 接口为异步回调,可能在 onCreate ()/onNewWant () 执行结束后才执行,临时变量被释放可能导致空指针异常。可以使用类成员变量避免该问题。对端用于创建分布式数据对象的 Object,其属性应在激活分布式数据对象前置为 undefined,否则会导致新数据加入组网后覆盖源端数据,数据恢复失败。应当在激活分布式数据对象之前,调用分布式数据对象的 on () 接口进行注册监听,防止错过 restore 事件导致数据恢复失败。
示例代码如下:
本文主要引用 HarmonyOS 官方文档。(文章转载自 51CTO,作者鸿蒙时代)