HarmonyOS鸿蒙Next中突然意识到一个问题,如果我已经使用了云数据库

HarmonyOS鸿蒙Next中突然意识到一个问题,如果我已经使用了云数据库 那么好像后续的开发过程当中,就不能随意的去增加新的DB,或者修改已有DB的表字段,因为这样会导致版本号自动更新,进而影响到已经上架的应用读取对应的云数据库。

这貌似是个死胡同,是不是意味着以后就不能再基于云数据库去研发新的功能?

19 回复

尊敬的开发者,您好,

新增对象类型引起版本号增加时对低版本号的APP是兼容的。关于对象类型的详细规则可以参考管理对象类型文档的说明。

开发者描述的之前存在过新增对象类型后本地调试失败的问题,是否可以提供下相关的日志信息或者demo以便进一步分析,感谢。

更多关于HarmonyOS鸿蒙Next中突然意识到一个问题,如果我已经使用了云数据库的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


你这个担心其实非常正常,很多人第一次用 HarmonyOS 云数据库(Cloud DB)都会有这个感觉:

“表结构一改,版本号就变了,
老版本 APP 会不会直接炸?”

但实际上:

云数据库本身并不是“不能升级”,而是:

需要按“数据库版本演进”方式去设计。

你现在最大的误区其实是:

把云数据库理解成:

“一旦上线就绝对不能改”

其实不是。

真正正确理解应该是:

“线上 schema 必须做兼容升级”

这和:

  • MySQL
  • PostgreSQL
  • Firebase
  • Realm
  • Room
  • GreenDao

本质上是一样的。

真正不能随便做的是:

1、直接删除字段

比如:

原来:

userName

老版本 APP 正在读。

结果你直接删了。

那:

老版本:

  • 反序列化失败
  • 查询失败
  • 字段空
  • SDK异常

都有可能。

2、直接修改字段类型

比如:

age: string
→
age: number

这种最危险。

老版本会直接解析失败。

3、直接删除表

这个也属于:

线上大忌。

真正推荐的做法是:

只做“向后兼容”的升级。

比如:

正确演进:

V1:
userName
age

升级:

V2:
userName
age
avatar
vipLevel

新增字段通常没问题。

因为:

老版本:

不认识的新字段会自动忽略。

所以:

云数据库最推荐的原则其实是:

只新增,不乱删

这个和很多互联网线上数据库原则一样。

你会发现:

很多大厂数据库里:

经常有:

xxx_new
xxx_v2
deprecated_xxx

就是因为:

线上不敢直接删字段。

如果后面功能越来越复杂怎么办?

行业里通常几种方案:

方案1:字段扩展(最常见)

不断:

  • 新增字段
  • 新增表

保持兼容。

这是最稳的。

方案2:版本隔离

比如:

user_table_v2
order_table_v3

新老版本并存。

等旧版本淘汰。

方案3:服务端兼容层

APP 不直接依赖 schema。

而是:

APP
↓
云函数/API
↓
Cloud DB

这是最推荐的架构。

因为:

以后你怎么改数据库,

APP 都不用直接感知。

其实你现在已经意识到一个很关键的问题:

“客户端直接绑定数据库 schema”

耦合会越来越严重。

所以:

中大型项目一般不会:

让 APP 直接深度操作 Cloud DB。

而是:

APP
→ API层
→ 数据层

做隔离。

你现在最应该做的不是:

“以后不敢改数据库了”

而是:

尽快建立:

schema migration(数据库演进)

思维。

另外:

HarmonyOS Cloud DB 本身也是支持:

  • schema version
  • 数据对象升级
  • 新字段扩展

这种设计思路的。

它本来就不是一次性数据库。

一句话总结:

不是以后不能新增功能,而是线上云数据库必须按“兼容升级”方式演进。真正危险的是删字段、改字段类型,而新增字段、新增表通常是安全的。中大型项目更推荐“APP → API → Cloud DB”隔离架构,而不是客户端直接强依赖数据库 schema。

目前有几个问题,第一就是如果我新增了对象类型,也就是所谓的新增表以后那么云数据库那里的版本号现在是5,它就会马上变成6,这好像就会导致已经上线了的APP如果在使用这个云数据库的话,就会无法读取?

第2个问题就在于,我之前一直尝试过使用云函数,然后再去调用云数据库的做法,但是出现了没办法获取access token的问题,所以只能使用客户端直接修改读取云数据库。

尊敬的开发者,您好,

  1. 本地使用云数据库文档中的示例部署云数据库后在AGC上新增对象类型,版本号改变后本地可以正常查询之前的数据,希望和开发者确认下开发者是在实际的使用过程中遇到了版本改变后无法进行正常的数据查询问题吗?方便的话可以提供下详细的问题日志信息吗?
  2. 云函数中可以通过云数据库的Server SDK来进行数据库的相关操作,开发者描述的无法获取access token问题,方便的话可以详细描述下问题场景,请问是在进行华为账号登录时无法获取吗?可以提供下具体的报错信息以便进一步分析吗,感谢。

云数据库文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/cloudfoundation-database-service

Server SDK文档:https://developer.huawei.com/consumer/cn/doc/AppGallery-connect-Guides/agc-clouddb-sdk-two-ways-0000002007572641

第2个问题我目前已经解决了,之前是因为设置了代理,没有办法下载完成N PM的命令,现在第1个问题我之前记得是在开发过程当中遇到过,就是我新增了一个对象类型之后,版本号由三变到4,然后本地调试的时候就发现不通,然后我手动把它改为了4就通了,所以我现在很担心如果去新增一个对象类型的话,会不会导致线上已经有的版本没办法正常使用云功能。

不是死胡同啊, 新增对象类型和新增字段都是安全的。真正需要谨慎的只有「删除已有字段」这类破坏性变更要走 Deprecate 流程。日常迭代中 90% 的场景(加新表、加新字段)都可以随时做,不影响已上架的老版本。

而且你每次修改数据库结构之后部署了之后会有个新的版本,同时你的端侧的配置json 也会更新 所以不影响

我记得反正是新增对象类型或者新增字段,都会让坂本号发生变化。但是我已经上架的APP是用以前的版本号呀。那一旦变化了的话,那已经在使用的APP不就读不到了吗?

已上架的不会影响 因为那个版本号不会变 ,但是你重新打包 就会读取新的版本号 ,看下图, 如有帮助给个采纳谢谢

cke_918.png

不是吧,我记得新增对象之后, agc后台的云存储里面的版本号就会马上发生变化的。这个我也是问过华为的AI智能客服的。,

不是死胡同,但云数据库要把 schema 演进当成版本兼容来设计,不能像本地临时表一样随意改字段。

比较稳的做法是:新增功能优先新增对象类型或新增可选字段,尽量不要改已有字段名、字段类型、主键或非空约束。旧客户端仍可能按旧的 schema.json 访问云侧对象,所以破坏性变更会带来兼容风险。新增字段后,需要重新导出 schema.json,并让客户端版本随包一起更新。

如果确实要做不兼容变更,建议新建对象类型或新建存储区做 V2,老版本继续读旧对象,新版本做数据迁移、双写或灰度切换。客户端里也要按版本处理缺省字段,避免旧数据没有新字段时报错。

另外排查时注意 schema.json 放置位置一致,避免 AppScope 和 entry 下同时存在 schema.json 导致构建时被覆盖;云侧对象变更后本地 schema.json 没同步,也可能触发 schema 配置不一致类错误。

好像不行,新增对象之后版本号还是会更新的。我之前做应用的时候专门留意过。新增对象,还有修改对象的类型字段都会让版本号更新,所以我说这是个死胡同。

有点道理。 ,

学习了。

在HarmonyOS NEXT中,若已使用云数据库(Cloud DB),需注意其基于ArkData的分布式特性:数据自动同步至云端,设备支持离线缓存,但需确保网络切换时数据一致性。冲突处理依赖版本号机制,且云数据库不提供实时联合查询,需自行设计数据模型。

这不是死胡同,是云数据库的版本控制机制。正确处理方式:

  • 新增DB:直接新建不涉及旧库,不受影响。
  • 修改已有DB的表字段:确实会生成新schema版本,但云侧默认保留旧版本供存量应用访问。新版本应用更新后按新schema读写,老版本继续用旧schema,直到后台清理旧版本。
  • 核心是你需要做好应用端schema版本判断,在代码里区分新旧字段的兼容逻辑,就能平滑演进,不是不能改。
回到顶部