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

Android Studio Room出现UNIQUE constraint failed: tbl_data.id错误如何解决

问题原因分析

UNIQUE constraint failed: tbl_data.id 报错本质是主键重复插入,SQLite中被@PrimaryKey修饰的字段默认自带唯一约束,你额外为id添加的unique索引属于冗余配置,不会影响该报错的触发。
你当前在MainActivity的onCreate生命周期中直接执行插入代码,每次APP启动/Activity重建时都会尝试插入id为1、2、3、4的四条重复数据,就会触发该约束报错。

解决方案

方案1:插入时设置冲突策略

在你的DataDao的insertC方法上添加onConflict参数,指定重复时的处理逻辑:

// 冲突时替换旧数据
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertC(Data... data);

可选的冲突策略:

  • OnConflictStrategy.REPLACE:新数据覆盖旧的同主键数据
  • OnConflictStrategy.IGNORE:遇到同主键数据时跳过插入,不报错
  • OnConflictStrategy.ABORT:默认策略,遇到冲突直接抛出异常(就是你当前的情况)

方案2:初始化数据前先判断数据库是否已有数据

修改插入逻辑,仅在数据库为空时才插入初始化数据,避免重复插入:

db = AppDatabase.getAppDatabase(this);
dataDao = db.getDataDao();
// 先查询数据总量,为0再插入
if (dataDao.getAllData().size() == 0) {
    dataDao.insertC(new Data(1,1315, 0.004 ), new Data(2,1316, 0.005), new Data(3,1317,  0.006), new Data(4,1318, 0.007));
}

你需要在DataDao中添加对应的查询方法:

@Query("SELECT * FROM tbl_data")
List<Data> getAllData();

方案3:主键设置自增长

如果你的id不需要手动指定,可以设置主键自增长,避免手动输入重复id的问题:
修改实体类的主键注解:

@PrimaryKey(autoGenerate = true)
private Integer id ;

此时创建Data对象时不需要传入id参数,由数据库自动生成唯一主键。

冗余代码优化建议

你已经将id设置为主键,不需要再额外添加unique的索引,主键默认就有唯一约束,可直接删除实体类@Entity注解中的indices配置:

@Entity(tableName = "tbl_data")
public class Data {
    // 原有代码不变
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:54:03