
回复
鸿蒙的分布式数据对象同步,让多设备数据协同变得「无感」。本文解析生命周期状态、同步流程与性能优化,附完整代码示例~
stateDiagram-v2
[*] --> 未初始化: 未创建实例
未初始化 --> 本地数据对象: create()
本地数据对象 --> 分布式数据对象: setSessionId()且设备≥2
分布式数据对象 --> 本地数据对象: 设备掉线或SessionId清空
分布式数据对象 --> [*]: revoke()
本地数据对象 --> [*]: destroy()
状态 | 特征 | 典型操作 |
---|---|---|
未初始化 | 无内存/磁盘数据 | 调用create() 创建实例 |
本地数据对象 | 仅本地存储,不同步 | 调用setSessionId() 准备组网 |
分布式数据对象 | 跨设备同步中,属性变更触发同步 | 修改属性、监听change 事件 |
已销毁 | 内存释放,磁盘数据清除 | 调用destroy() 释放资源 |
title: '文档标题',
content: '初始内容'
console.log(`字段${fields}已同步`);
this.dataObj.save(); // 自动持久化到本地数据库
// 仅同步变更的属性(避免全量传输)
dataObj.title = '新标题'; // 仅同步title字段
// 系统自动压缩二进制数据(如图片)
dataObj.bindAssetStore('image.png', {
data: imageBuffer,
compress: true // 启用压缩(默认开启)
});
// 设备离线时暂存变更,联网后自动补发
dataObj.enableOfflineCache(true);
dataObj.content = '离线修改内容'; // 暂存本地,联网后同步
import { distributedDataObject } from '@ohos.ark.data';
export class NoteSync {
private dataObj: DistributedDataObject;
constructor(context: Context, sessionId: string) {
// 初始化数据对象(含默认值)
this.dataObj = distributedDataObject.create(context, {
noteTitle: '默认标题',
noteContent: '开始编辑...',
lastUpdate: new Date().getTime()
});
this.dataObj.setSessionId(sessionId); // 加入同步组
this.initListener();
}
}
// 修改笔记内容
updateNote(title: string, content: string) {
this.dataObj.noteTitle = title;
this.dataObj.noteContent = content;
this.dataObj.lastUpdate = Date.now(); // 触发同步
}
// 监听同步事件
private initListener() {
// 跨设备变更通知
this.dataObj.on('change', (sessionId, fields) => {
if (fields.includes('noteContent')) {
this.onContentUpdated(); // 更新本地UI
}
});
// 网络状态变更
this.dataObj.on('status', (sessionId, networkId, status) => {
if (status === 'OFFLINE') {
showToast('设备离线,变更将暂存');
}
});
}
// 移除指定设备同步权限
revokeDevice(deviceId: string) {
this.dataObj.revoke(deviceId); // 停止向该设备同步
}
// 释放资源
destroy() {
this.dataObj.destroy(); // 清除内存与本地存储
}
项目ID-设备类型
)生成唯一SessionId// 冲突解决:以最新更新时间为准
dataObj.on('conflict', (oldData, newData) => {
return newData.lastUpdate > oldData.lastUpdate ? newData : oldData;
});
// 限制仅特定设备可写
dataObj.setAccessControlList([
{ deviceId: 'device-001', permission: 'WRITE' },
{ deviceId: '*', permission: 'READ' } // 其他设备只读
]);