异常处理系列: android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed

时间:2021-07-05 05:29:00

出现这个异常的时候,可以先肯定是你对android数据库操作的时候出问题了。

情况1:你定义的字段为 not null而插入时对应的字段却没值。

情况2:你定义的字段设定PRIMARY,而插入的值已经在表中存在。


先说说我遇到的情况吧,类似如下:

两张表:部门表(Depart)和员工表(Employee)

Depart:departId,departName
Employee:employeeId,employeeName,foreignDepartId

public void add(Employee em,Depart dp){
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
//把部门插入到表中
db.execSQL("insert into Depart(departId,departName) values(?,?)",
new Object[]{dp.getDepartId(),dp.getDepartName()});
//把员工插入到这个部门中
db.execSQL("insert into Employee(employeeId,employeeName,foreignDepartId) values(?,?,?)",
new Object[]{em.getEmployeeId(),em.getEmployeeName,dp.getDepartId()});
}

上边这个是写在业务层的,是一个增加的方法

然后我们在测试程序里边调用的时候:
private Service service = new Service();
public void testAdd(){
Depart dp = new Depart(1,"外交部");
Employee em = new Employee(1,"张三",dp.getDepartId());

service.add(em,dp);
}
按照上边的来说,第一条数据是可以插入的。


但是,如果我们把testAdd()函数里边的Employee em = new Employee(1,"张三",dp.getDepartId());这条语句中的1换成2之后,再插入就会出错:

因为在插入Employee对象的时候Depart对象也要再插入一遍,但是数据库中是有这个对象对应的Id了。

所以,这里我们要在add()中加入一个查询,查询Dept对象对应的id在数据库中是否存在。