1

データベースにテーブルがあり、新しいレコードを追加するときに、id を使用してレコードが存在するかどうかを確認しています。存在する場合は、レコードを更新し、新しいレコードを追加しない場合。しかし、例外が発生しています:

2006-2259/? E/SQLiteDatabase: 挿入エラー id=080333 phone=080333 total_owed=15050.0 total_debts=0 name=Alison Jones android.database.sqlite.SQLiteConstraintException: 列 ID が一意ではありません (コード 19)

これは、レコードが存在するかどうかを確認するメソッドです。

 public boolean checkIfExists(String tableName, String value) {

    SQLiteDatabase database = this.getReadableDatabase();

    String Query = "Select * from " + tableName + " where " + DEBTOR_ID + " = " + value;
    Cursor cursor = database.rawQuery(Query, null);
    if(cursor.getCount() <= 0){
        cursor.close();
        return false;
    }
    cursor.close();
    return true;

}

ここで使用されています:

            debtor.setDebtorName(params[0]);
            debtor.setPhoneNumber(params[1]);
            debtor.setTotalAmountOwed(Double.parseDouble(params[6]));
            debtor.setTotalDebts(0);

            if (databaseHandler.checkIfExists(DebtDatabaseHandler.DEBTOR_TABLE_NAME, params[1])) {
                Log.d("NewDebtFragment", "Record already exist");
                databaseHandler.updateRecord(2, debtor.getTotalAmountOwed() + 50000);
            } else {
                debtorId = databaseHandler.addDebtor(debtor);
            }

これは競合の問題であるため、明らかに既存のレコードのチェックが機能していません。コードが問題ないように見えるため、これがなぜなのかわかりません (?)

これはテーブルを作成する方法です:

String CREATE_DEBTOR_TABLE = "CREATE TABLE  " + DEBTOR_TABLE_NAME + " ( " +
            DEBTOR_ID + " TEXT PRIMARY KEY, " +
            DEBTOR_NAME + " TEXT, " +
            PHONE_NUMBER + " TEXT, "+
            TOTAL_DEBTS + " INTEGER, " +
            TOTAL_OWED + " INTEGER) ";

そしてupdateRecord方法:

 public void updateRecord(int newTotalDebt, double newTotalOwed) {

    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(TOTAL_DEBTS, newTotalDebt);
    contentValues.put(TOTAL_OWED, newTotalOwed);

    db.update(DEBTOR_TABLE_NAME, contentValues, DEBTOR_ID, null);


}
4

1 に答える 1

8

クエリを以下に置き換えます

 String Query = "Select * from " + tableName + " where " + DEBTOR_ID + " = '" + value+"'";

selectionvalueは string であるため、一重引用符で囲む必要があります。

更新 :
レコードが終了するかどうかをチェックするためのコード全体を記述し、終了する場合はそのレコードを更新する代わりに、これらすべてを単純な 1 行に置き換えることができます。

database.insertWithOnConflict(table,null,values,SQLiteDatabase.CONFLICT_REPLACE);

例外を内部的に処理しCONFLICT_REPLACE、UNIQUE 制約違反が発生した場合、現在の行を挿入または更新する前に、制約違反の原因となっている既存の行が削除されることを指定します。

于 2015-06-08T10:15:48.453 に答える