0

私は検索して見つけました: How to check if a value already exists in the database in Android . 私が抱えている問題は、トーストが表示されず、入力されている値がデータベースに既にある値と一致する場合でも、データがデータベースに入力されることです。データが重複していないことを確認するために UNIQUE を使用することについての投稿を見たことがありますが、私が必要としているものには機能しません。if (entries.contains(checkDuplicates) == false) と if (!entries.equals(checkDuplicates)) を試してみましたが、それらでも同じ結果が得られました。私が見逃している、または理解していないのは単純なことだと私は知っています。誰かが私を助けて、正しい方向に向けてください。

    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 = fiveAndTwo.getText().toString();

    /**
     * CRUD Operations
     * */
    // Inserting entries to DB

    // Reading all contacts
    Log.d("Reading: ", "Reading all entries..");

    List<EventEntries> entries = db.getAllEntries();

    for (EventEntries ee : entries) {
        String log = "Id: " + ee.getID() + " Date: " + ee.getDate() + " Event Name: " + ee.getEvent() + " Emp ID: " + ee.getempID();

        // Writing entries to log
        Log.d("Entry: ", log);


    }

    String checkDuplicates =  date + event + empID;

    if (!entries.contains(checkDuplicates)) {

        Log.d("Insert: ", "Inserting ..");

        db.addEntry(new EventEntries(date, event, empID));
        String logEntry = "Date: " + date + " Event Name: " + event + " Emp ID: " + empID;
        Log.d("Entered to DB:", logEntry);

    } else {

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

    }
}

編集:動作するようになりました。これが私がしたことです:

    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 = fiveAndTwo.getText().toString();

    /**
     * CRUD Operations
     * */

    // Reading all entries
    Log.d("Reading: ", "Reading all entries..");

    List<EventEntries> entries = db.getAllEntries();

    for (EventEntries ee : entries) {
        String log = "Id: " + ee.getID() + " Date: " + ee.getDate() + " Event Name: " + ee.getEvent() + " Emp ID: " + ee.getempID();

        // Writing entries to log
        Log.d("Entry: ", log);

    }

    EventEntries checkDuplicates = new EventEntries(date, event, empID);

    if (!entries.contains(checkDuplicates)) {

        Toast.makeText(this,"Successfully entered.", Toast.LENGTH_SHORT).show();

        // Inserting entries to DB
        Log.d("Insert: ", "Inserting ..");
        db.addEntry(new EventEntries(date, event, empID));
        String logEntry = "Date: " + date + " Event Name: " + event + " Emp ID: " + empID;
        Log.d("Entered to DB:", logEntry);


    } else  {

        empAlert();

    }
}

EventEntries クラスに追加したものは次のとおりです。

    @Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((_date == null) ? 0 : _date.hashCode());
    result = prime * result + ((_empID == null) ? 0 : _empID.hashCode());
    result = prime * result + ((_event == null) ? 0 : _event.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    EventEntries other = (EventEntries) obj;
    if (_date == null) {
        if (other._date != null)
            return false;
    } else if (!_date.equals(other._date))
        return false;
    if (_empID == null) {
        if (other._empID != null)
            return false;
    } else if (!_empID.equals(other._empID))
        return false;
    if (_event == null) {
        if (other._event != null)
            return false;
    } else if (!_event.equals(other._event))
        return false;
    return true;
}
4

2 に答える 2

3

entries.contains(checkDuplicates)はオブジェクトentriesのリストであり、 であるため、常に false を返します。オブジェクトをパラメーターとして使用して呼び出す必要があります。EventEntriescheckDuplicatesStringentries.containsEventEntries

もう一つ:

// assuming entries is not empty
EventEntries first = entries.get(0);
entries.contains(first);  // --> this is TRUE

// create a dupe of "first"
EventEntries firstDupe = new EventEntries(.....);
entries.contains(firstDupe);  // --> in *general* this is FALSE

一般に、2 番目のケースは誤りです。クラスでメソッドEventEntriesをオーバーライドしてtrueを返す場合、trueになる可能性があります。その場合にのみ、2 番目の例は true を返します。equalsfirst.equals(firstDupe)

実装例を次に示します。

public boolean equals(Object obj) {
    if (obj instanceof EventEntries) {
        EventEntries other = (EventEntries)obj;
        if (date.equals(other.date) && event.equals(other.event)
            && empID == other.empID) {
            return true;
        }
    }
    return false;
}

(必要に応じて調整してください。)

于 2013-02-22T19:03:20.787 に答える