2012-05-10 15 views
3

私はsqliteデータベースを持つアンドロイドアプリを持っています。時々私は私のテーブルを更新するとき、私は次のエラーを取得:アンドロイドのsqlite制約が更新に失敗しました

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にすることはできません。

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

+0

プライマリキーを更新することはできません。 – Dhruvisha

+0

@Dhruvisha私は主キーを更新していません。私の主キーは_idで、フィールドLTを更新しています。 – Ran

+0

チェックフィールドLT。それはあなたが更新している本当の価値ですか? – Dhruvisha

答えて

1

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

2)してみてください:

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

3)あなたは情報(...)に正しくパラメータを渡すのですか?

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

+0

私は主キーを更新していないので、テーブルに何も挿入していません。 – Ran

+0

Androidでアプリのデータをクリアし、HISTを再作成できますか?たぶん以前のアプリのバージョンで定義された古い構造を持っています。 – breceivemail

0

result[i].getLt()が本当に決して

+0

float変数(Floatではなく)を返しますが、nullにすることはできません。 – Ran

0

あなたがループoustside updateTempStatement.execute();呼び出す必要がnullを返していないことをダブルチェック。

+0

なぜですか?カーソルの各行の更新があります。 – Ran

+0

このexecute()メソッドは時間がかかり、さらに多くのリソースを使用するためです。だからあなたはこれらの望ましくないエラーを得ることはできません。 – AnkitRox

1

まず、これはどのように有効な列ですか?

int hsuInd = c.getColumnIndex( "HSU");

テーブルを見ると、その列はHSとマークされています。

第2に、更新機能を使用する方がよいでしょうか?

ContentValues values = new ContentValues(); 
values.put("LT", (Double) result[i].getLt()); 
int result = db.update("HIST", values, "_id = " + c.getInt("_id"), null); 
+0

HSUは、クエリ内の式から計算された列です。私は、SQLiteStatementの使用がより効率的であると信じています(毎回クエリを再構築する必要はなく、SQLiteDatabaseのソースをチェックしてください)。 – Ran