同应用跨设备同步数据
时间: 2026-04-15 11:26:25
(部分内容来自网络,其真实性存疑,为了避免对您造成误导,请谨慎甄别。)
好,不说废话。直接给你最底层的真相。
一、你的需求本质
同应用跨设备同步数据,不需要接续、不需要协同、不需要任何花哨功能。
你要的就是:A设备写数据 → B设备收到数据。
就这么简单。
二、华为这套东西的底层架构
┌─────────────────────────────────────────┐
│ 你的应用 │
├─────────────────────────────────────────┤
│ API层(Preferences / KVStore / DDO) │
├─────────────────────────────────────────┤
│ 分布式数据服务 (DatamgrService) │
├─────────────────────────────────────────┤
│ 分布式软总线 (Soft Bus) │
│ 设备发现 | 连接 | 加密传输 │
└─────────────────────────────────────────┘
软总线是唯一靠谱的底层:设备发现、连接、数据传输都靠它。前提是两台设备登录同一个华为账号,开Wi-Fi和蓝牙。
三、三个接口的真相(直接说人话)
1. Preferences(轻量级KV)
- 存哪:磁盘
- 怎么同步:put() + flush() 后自动同步
- 监听:on('change') 收远端数据
- 限制:适合小数据(配置、设置项)
let pref = await preferences.getPreferences(context, 'my_store');
await pref.put('key', 'value');
await pref.flush(); // 这行触发同步
pref.on('change', (key) => {
let newVal = pref.get(key);
});2. 分布式KVStore
- 存哪:磁盘
- 怎么同步:put() 自动触发 / 手动 sync()
- 监听:on('dataChange')
- 限制:单条value最大4MB,同时最多开16个store
let kvStore = await kvManager.getKVStore('store_id', {
autoSync: true // 自动同步
});
await kvStore.put('key', 'value');
kvStore.on('dataChange', (data) => {
// 收到远端数据
});3. 分布式数据对象 (DDO)
- 存哪:内存
- 怎么同步:改属性就自动同步
- 监听:on('change')
- 限制:应用退出数据丢,适合实时状态
let obj = distributedDataObject.createDistributedObject({ name: 'test' });
obj.setSessionId('session_123');
obj.name = 'new name'; // 这行触发同步
obj.on('change', (fields) => {
console.log(obj.name); // 收到
});四、最稳妥的选择(没有之一)
如果你要持久化 + 自动同步:
| 数据量 | 选哪个 | 原因 |
|---|---|---|
| 配置、小字段 | Preferences | 最简单,代码最少,自动同步 |
| 结构化数据 | KVStore (SINGLE_VERSION) | 稳定,可控,4MB够用 |
| 实时状态(不存盘) | DDO | 改属性就同步,零代码 |
我的推荐:Preferences
原因:
1. 不需要手动调sync()
2. flush()后系统帮你同步
3. on('change')直接收数据
4. 代码量最少
五、你必须面对的两个前提
1. 同账号:两台设备登录同一个华为账号
2. 开Wi-Fi和蓝牙:软总线靠这个组网
这两个不满足,什么都同步不了。这是硬性条件,不是华为文档吹牛。
六、代码模板(直接复制改)
import preferences from '@ohos.data.preferences';
export class DataSyncManager { private pref: preferences.Preferences | null = null; private context: Context;
constructor(ctx: Context) { this.context = ctx; }
async init(storeName: string) { this.pref = await preferences.getPreferences(this.context, storeName); // 监听远端数据变化 this.pref.on('change', async (key: string) => { let newValue = await this.pref?.get(key, ''); console.log(收到同步: ${key} = ${newValue}); // 这里更新你的UI或状态 }); }
async set(key: string, value: string) { await this.pref?.put(key, value); await this.pref?.flush(); // 触发同步 }
async get(key: string): Promise{ return await this.pref?.get(key, '') || ''; } }
七、总结
| 你听说的 | 真相 |
|---|---|
| 应用接续 | 跨设备搬整个页面,跟数据同步没关系 |
| 协同服务 | 专用来调相机图库,不是通用通道 |
| 分布式数据库 | 就是Preferences/KVStore/DDO三选一 |
| 软总线 | 唯一靠谱的底层,设备发现+连接+传输 |
最稳妥:Preferences + on('change') + flush()
不需要sync()、不需要sessionId、不需要wantParam。就这么简单。
华为文档把简单的东西包装成营销话术,去他妈的。