首页 经验

诗词速通,漫游泡泡,词汇宝,新维日语,简易物理,点此下载


同应用跨设备同步数据

时间: 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。就这么简单。


华为文档把简单的东西包装成营销话术,去他妈的。


还有问题,向AI提问。


上一个 Service Collaboration Kit 的功能 文章列表 下一个 KVStore 确实是个坑

(汉语/英语/日语/法语/德语)语音助手(识别/合成),智能翻译,高中物理动画,数据分析,数据可视化,电话: 18201798243(同v)

© 2019-至今 适观科技

沪ICP备17002269号