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
相关产品推荐
相关产品推荐

