我有一个带有sqlite数据库的Android应用程序。有时当我更新我的表时,我得到以下错误:
error code 19: constraint failed android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
我没有看到哪个约束可以失败,因为我没有外键而且我没有插入NULL值。
表格:
"CREATE TABLE HIST (" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"CL TEXT UNIQUE, " +
"ACOUNT INTEGER DEFAULT 0, " +
"HS INTEGER DEFAULT 0," +
"EX INTEGER DEFAULT 0," +
"LU INTEGER NOT NULL DEFAULT 0," +
"LT REAL NOT NULL DEFAULT 0);";
更新代码:
SQLiteStatement updateTempStatement = db.compileStatement("UPDATE HIST " +
" SET LT=? WHERE _id=?");
Cursor c = null;
c = db.rawQuery(QUERY_SQL, new String[] { hs?"1":"0" });
Info[] result = null;
if (c.getCount() > 0) {
result = new Info[c.getCount()];
int i = 0;
int idInd = c.getColumnIndex("_id");
int cInd = c.getColumnIndex("CL");
int hsuInd = c.getColumnIndex("HSU");
int ltInd = c.getColumnIndex("LT");
db.beginTransaction();
try {
while (c.moveToNext()) {
result[i] = new Info(c.getString(cInd),
c.getFloat(hsuInd),
c.getFloat(ltInd));
updateTempStatement.bindDouble(1, result[i].getLt());
updateTempStatement.bindLong(2, c.getLong(idInd));
updateTempStatement.execute();
i = i + 1;
}
db.setTransactionSuccessful();
}
finally {
db.endTransaction();
}
}
c.close();
updateTempStatement.close();
例外情况是updateTempStatement.execute();
。
我看到的唯一约束是"NOT NULL"
,但方法Info.getlt()
返回一个浮点基元,因此它不能为NULL。
还有其他想法吗?
答案 0 :(得分:1)
1)您的表的一个重要约束是主键。当您尝试更新主键或将重复的主键插入表中时,会发生此错误。
2)尝试:
c.moveToFirst();
do {
//...
} while (c.moveToNext());
3)您是否正确地将参数传递给Info(...)?
4)您是否在Info(...)中正确分配值?
答案 1 :(得分:1)
首先,这是一个有效的列?
int hsuInd = c.getColumnIndex(“HSU”);
查看您的表格,该列标记为HS。
其次,使用更新功能不是更好吗?
ContentValues values = new ContentValues();
values.put("LT", (Double) result[i].getLt());
int result = db.update("HIST", values, "_id = " + c.getInt("_id"), null);
答案 2 :(得分:0)
仔细检查result[i].getLt()
真的永远不会返回null
答案 3 :(得分:0)
你应该在循环之外调用updateTempStatement.execute();
。