Room数据库迁移时@SerializedName与@ColumnInfo是否必须同名?
问题原因解析
首先得明确:@SerializedName和@ColumnInfo是完全独立的两个注解,职责毫无重叠:
@SerializedName是Gson等JSON序列化库的注解,只负责JSON数据和实体类对象之间的字段映射,和Room数据库的表结构、列名没有任何关系。@ColumnInfo是Room专属注解,用来指定实体类字段对应的数据库表列名。如果不写这个注解,Room默认用实体类的字段名作为列名。
你遇到的迁移失败,核心是混淆了两者的作用范围:
当你给新字段加了@ColumnInfo("parent_scac"),Room就认定这个字段对应数据库表的parent_scac列——迁移时(不管自动还是手动),Room会检查数据库是否存在这个列。但如果你在迁移操作里(比如手动写SQL添加列时)错误地加了scac列(误以为@SerializedName会影响Room的列名),自然会出现“预期包含parent_scac列但实际不存在”的错误。
而当你把两个注解设为同名时,比如都用"scac",Room预期的列是scac,你迁移时添加的也是scac列,两者匹配,所以迁移成功。
额外注意
- 手动迁移时,SQL语句里的列名必须和
@ColumnInfo指定的完全一致,和@SerializedName没关系。 - 自动迁移时,Room只认实体类里的
@ColumnInfo(或默认字段名)来生成变更逻辑,JSON序列化的配置不会影响数据库结构判断。
内容的提问来源于stack exchange,提问作者iwannabejonesy
相关产品推荐
相关产品推荐

