更新时android sqlite约束失败

时间:2012-05-10 07:06:23

标签: android sqlite

我有一个带有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。

还有其他想法吗?

4 个答案:

答案 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();