3

私は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()は float プリミティブを返すため、NULL にすることはできません。

他のアイデアはありますか?

4

4 に答える 4

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);
于 2012-05-16T01:45:37.013 に答える
1

1)テーブルの重要な制約の1つは、主キーです。このエラーは、主キーを更新しようとしたとき、または重複した主キーをテーブルに挿入しようとしたときに発生します。

2)試してください:

c.moveToFirst();
do {    
    //...
} while (c.moveToNext());

3)パラメータをInfo(...)に正しく渡しますか?

4)Info(...)で値を正しく割り当てていますか?

于 2012-05-13T05:55:15.200 に答える
0

result[i].getLt()本当にnullを返さないことを再確認してください

于 2012-05-13T06:27:51.970 に答える
0

You should call updateTempStatement.execute(); oustside the loop.

于 2012-05-15T04:50:59.373 に答える