文字能同步,为什么图片传过去就裂了?

文章封面

前两篇文字同步都跑通了。这篇加图片附件。

最开始的思路很简单:把文件路径同步过去,另一台设备直接读不就行了?

结果传过去,图片直接裂了。才意识到:一个文件路径,传到另一台设备上根本没有意义。那台设备上根本没有这个文件。

一、本地路径为什么没有跨设备意义

先想一下:手机上的文件路径是 /data/xxx/photo.jpg,这个路径在手机上是对的。

但传到平板上,平板上根本没有这个路径的文件。路径只是个地址,文件本身没过去。

方式文件本身跨设备
同步本地路径没过去不行
Asset 迁移过去了可以

二、Asset 是什么

Asset 就是专门用来跨设备迁移文件的。它不是一个路径,是带着文件实体的。

你把文件放到 Asset 里,分布式数据对象同步的时候,会把文件实体一起传过去。

这段代码解决什么问题: 把图片作为 Asset 同步。
文件: distributed/NoteObject.ets
用途: 附件跨设备同步
接入位置: 笔记添加图片

import { distributedDataObject } from '@kit.ArkData';
import { commonType } from '@kit.ArkData';

// 创建 Asset
let imageAsset: commonType.Asset = {
  name: 'photo.jpg',
  uri: 'file://docs/storage/Users/currentUser/photo.jpg',
  createTime: '2026-09-22',
  mimeType: 'image/jpeg'
};

// 放到分布式对象里
noteObj.image = imageAsset;

这样同步的时候,图片文件就跟着一起过去了。

系统架构图

三、bindAssetStore 是什么

光同步文件还不够。笔记记录存在数据库里,附件也得跟数据库绑定。

bindAssetStore 就是把 Asset 和 RDB 数据库绑定起来。数据库里存的笔记记录和附件文件,形成完整的数据关系。

四、几个容易踩的坑

第一个坑:直接同步 /data/… 本地路径。路径传过去了,文件没过去。

第二个坑:把多个附件直接塞进 Asset 数组。有限制,不是随便塞。

第三个坑:文件没进入支持的分布式目录。文件得在支持的目录里才能同步。

第四个坑:数据库记录已经同步但附件还没准备好。记录到了,文件还没下完。

运行效果图

这次做附件同步最大的体会是:描述一个文件和真正搬一个文件,完全是两件事。路径只是描述,Asset 才是真正把文件实体搬过去。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐