0

複数の列の情報に基づいて重複レコードを確認する必要があります。チェックに 1 つの列のみを使用する場合は動作させることができますが、3 つの列をチェックする必要があり、3 つの列すべてが一致する場合はトーストを表示します。以下のコードは実行されますが、db には何も書き込まれません。if ステートメントから 2 つの文字列を削除すると、正常に機能し、db に書き込みます。複数のカーソルを使用してみましたが、複数の列で重複をチェックしようとしても同じ結果になります。

private void saveState() {

    Calendar calendar = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
    eventDate = sdf.format(calendar.getTime());

    String date = eventDate;
    String event = eventTitle.getText().toString();
    String empID = result;

    Cursor cursor = mDbHelper.fetchAllEntries();

    while (cursor.moveToNext()) {

    String enteredDate = cursor.getString(cursor.getColumnIndex("date"));
    String enteredEvent = cursor.getString(cursor.getColumnIndex("event"));
    String enteredEmpId = cursor.getString(cursor.getColumnIndex("empID"));

        if ( (enteredEmpId.equals(empID)) && (enteredDate.equals("date") && (enteredEvent.equals(event)))) {
            Toast.makeText(this, "Employee has already been scanned for this event.", Toast.LENGTH_LONG).show();  
        } else {
            mDbHelper.createEntry(date, event, empID);
        }
    }
}

必要に応じて、ヘルパー クラスの fetchAllEntries() も次のようになります。

public Cursor fetchAllEntries() {

    return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_DATE,
            KEY_EVENT, KEY_EMPID}, null, null, null, null, null);
}

編集:トーストを表示するようにしましたが、何らかの理由でまだデータベースに書き込み中です。また、トーストが画面に長時間表示されていることにも気付きました。whileループに入っていて、完了するまで消えないからだと思います。前に言い忘れましたが、このアプリはバーコードをスキャンしているため、スキャンが行われた日付とイベントが既にスキャンされているかどうかを認識できる必要があります。これが更新されたコードです

private void saveState() {

    Calendar calendar = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
    eventDate = sdf.format(calendar.getTime());

    String date = eventDate;
    String event = eventTitle.getText().toString();
    String empID = result;

    Cursor cursor = mDbHelper.fetchAllEntries();

    if (cursor.getCount() == 0) {

        mDbHelper.createEntry(date, event, empID);

    } else if (cursor.getCount() > 0 ) {

    while (cursor.moveToNext()) {

    String enteredDate = cursor.getString(cursor.getColumnIndex("date"));
    String enteredEvent = cursor.getString(cursor.getColumnIndex("event"));
    String enteredEmpId = cursor.getString(cursor.getColumnIndex("empID"));

         if ((enteredDate.equals(date)) && (enteredEvent.equals(event)) && (enteredEmpId.equals(empID))) {

            Toast.makeText(this, "Employee has already been scanned for this event.", Toast.LENGTH_SHORT).show();  

        } else {

            mDbHelper.createEntry(date, event, empID);

        }
    }
}

}

4

1 に答える 1

0

複数の行に同じ値があるかどうかを確認します。

SELECT COUNT(*) FROM myTable WHERE column1 = 'x' AND column2 = 'y' AND column3 = 'z'

カウントが 1 を超える場合、重複があり、そのような最初の行の ID を取得します。

SELECT id FROM myTable WHERE column1 = 'x' AND column2 = 'y' AND column3 = 'z' LIMIT 1

残りの行を削除します。

DELETE * FROM myTable WHERE column1 = 'x' AND column2 = 'y' AND column3 = 'z' AND id != myId
于 2013-02-20T17:39:52.147 に答える