distributedDataObject和kvstore区别
时间: 2026-04-15 11:47:41
(部分内容来自网络,其真实性存疑,为了避免对您造成误导,请谨慎甄别。)
好,直接说区别,不扯废话。
一、一句话总结
| 对比项 | DistributedDataObject (分布式数据对象) | KVStore (分布式键值库) |
|---|---|---|
| 数据存哪 | 内存。应用退出,数据就没了 | 磁盘。应用退出,数据还在 |
| 怎么同步 | 改属性就自动同步,不需要调任何方法 | 默认自动同步,也可以手动调 sync() 控制时机 |
| 同步粒度 | 属性级。改哪个属性就只同步哪个属性 | 键级。改哪个key就只同步哪个key |
| 数据形态 | JS对象,像操作本地变量一样操作 | 键值对,put(key, value) / get(key) |
| 查询能力 | 无。只能整个对象读 | 有。支持条件查询、前缀查询 |
| 冲突处理 | 无。需要业务自己合并 | SINGLE_VERSION:后写覆盖;DEVICE_COLLABORATION:按设备分片,不冲突 |
| 限制 | 单对象 ≤ 500KB,最多16个实例,最多3台设备 | 单key的Value ≤ 4MB,最多16个库 |
| 适合场景 | 页面标题、光标位置、播放进度、开关状态 | 配置项、待办列表、消息记录、结构化数据 |
二、按你的需求选
你要的是:同应用跨设备同步数据
| 你的数据特征 | 选哪个 | 原因 |
|---|---|---|
| 需要持久化,重启后还在 | KVStore | 数据存磁盘 |
| 不需要持久化,页面关了数据无所谓 | DistributedDataObject | 更简单 |
| 数据量超过500KB | KVStore | 单对象500KB硬上限 |
| 需要查询(比如查所有key、按前缀查) | KVStore | 支持Query |
| 只是页面状态同步(标题、选中项) | DistributedDataObject | 改属性就同步,代码最少 |
| 两设备可能同时改同一条数据 | KVStore + DEVICE_COLLABORATION模式 | 按设备分片,天然不冲突 |
三、代码对比
DistributedDataObject
import { distributedDataObject } from '@kit.ArkData';
// 创建对象
let obj = distributedDataObject.create(context, {
title: '标题',
content: '内容'
});
// 设置sessionId(同ID自动组网)
let sessionId = distributedDataObject.genSessionId();
obj.setSessionId(sessionId);
// 监听其他设备的数据变化
obj.on('change', (sessionId, fields) => {
console.log('变化字段:', fields);
console.log('新标题:', obj.title);
});
// 修改数据(自动同步到其他设备)
obj.title = '新标题';KVStore
import { distributedKVStore } from '@kit.ArkData';
// 创建KVManager
let kvManager = distributedKVStore.createKVManager({
context: context,
bundleName: 'com.example.app'
});
// 获取KVStore
let kvStore = await kvManager.getKVStore('store_id', {
autoSync: true, // 自动同步
kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION
});
// 写数据(自动同步)
await kvStore.put('title', '新标题');
// 读数据
let title = await kvStore.get('title');
// 监听其他设备的变化
kvStore.on('dataChange',
distributedKVStore.SubscribeType.SUBSCRIBE_TYPE_REMOTE,
(data) => {
console.log('收到远端数据:', data);
}
);四、关键区别(你之前调不通的原因)
| 问题 | DistributedDataObject | KVStore |
|---|---|---|
| 接收方必须设undefined | ✅ 必须。否则数据会被覆盖 | ❌ 不需要 |
| sessionId必须一致 | ✅ 必须。否则不同步 | ❌ 不需要 |
| 需要手动sync | ❌ 不需要 | ⚠️ 可选,默认autoSync=true就行 |
| 数据丢了不报错 | ⚠️ 会。因为存内存 | ✅ 不会,存磁盘 |
你之前DistributedDataObject调不通,大概率是接收方没把属性设成undefined。