You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Room Database编译错误:字段列名不唯一问题求助

解决Room数据库“Field has non-unique column name”编译错误

嘿,这个错误我之前帮好几个开发者排查过,本质就是Room在生成SQLite表的时候,发现有重复的列名了——数据库表的每一列名字必须是唯一的,不然SQLite根本不知道该对应哪个字段。

先看你给出的Team实体代码,虽然没写完,但大概率是这两个原因之一:

  • 某个字段的默认列名(也就是字段本身的名字)和其他字段通过@SerializedName或@ColumnInfo指定的列名撞了
  • 你没写完的后续字段里,有重复的列名定义

给你几个具体的解决步骤:

1. 给所有字段显式指定唯一列名

别依赖Room的默认映射,用@ColumnInfo注解给每个字段明确分配一个独一无二的列名,这样能彻底避免冲突。比如修改你的实体类:

@Entity(tableName = "Team", 
        foreignKeys = { @ForeignKey(entity = Group.class, parentColumns = "id", childColumns = "groupId")}, 
        indices = {@Index("groupId")})
public class Team {
    @PrimaryKey
    @ColumnInfo(name = "team_id") // 把默认的"id"改成"team_id",避免和Group的id列混淆
    private long id;
    
    @ColumnInfo(name = "group_id")
    private long groupId;
    
    @SerializedName("Team")
    @ColumnInfo(name = "team_name") // 这里明确列名,和@SerializedName的名字区分开
    private String name;
    
    @ColumnInfo(name = "english_team_name")
    private String englishName;
    
    @SerializedName("Played")
    @ColumnInfo(name = "matches_played")
    private int played;
    
    @SerializedName("Victories")
    @ColumnInfo(name = "match_wins")
    private int win;
    
    // 剩下的字段也照这个方式,用@ColumnInfo指定唯一列名
}

2. 检查是否有重复的列名定义

仔细过一遍所有字段的@ColumnInfo注解,确保没有两个字段用了同一个name值。比如如果有两个字段都写了@ColumnInfo(name = "name"),那肯定会触发这个错误。

3. 排查关联/继承的实体列名冲突

如果你的Team实体继承了某个父类,或者嵌入了其他实体(比如用@Embedded),一定要检查父类/嵌入实体里的字段列名,别和当前Team的字段列名重复。要是有重复,同样用@ColumnInfo给其中一方重命名。

最后,改完代码后记得先清理项目(Build -> Clean Project)再重新编译,有时候Android Studio的缓存会导致一些奇怪的编译错误,清完缓存再编译大概率能解决。

内容的提问来源于stack exchange,提问作者Peyman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:03:14