gpt4 book ai didi

android - 在 SQLite 数据库中插入数据之前检查重复项

转载 作者:行者123 更新时间:2023-11-30 02:52:35 25 4
gpt4 key购买 nike

我通过单击按钮将 3 个值插入数据库,1 是插入日期,2 是来自 editText 的数字,第 3 个是分配给被单击按钮的值(有六个不同的按钮可以被点击)

我想做的是检查日期和数字是否已经在数据库中,第三个值无关紧要。我不能在任何列上使用 unique,因为我希望能够再次输入 editText 中的数字,但不能在同一天输入。

我已经走到这一步了...并且它不会向数据库输入任何数据

来自主 Activity

    public void onClick_30(View v) {

counter++;
cnt_bcs30++;

String getCowNum = CowNum.getText().toString();

Cursor C = myDB.dubUpCheck();
String ddate = C.getString(DBAdapter.COL_DATE);
String cow = C.getString(DBAdapter.COL_COW);


if(C.moveToFirst()){

do {

if(ddate == dateFormat.format(date) && cow == getCowNum){
Toast.makeText(getBaseContext(), getCowNum + "Has already been scored today ",
Toast.LENGTH_SHORT).show();
}
}while (C.moveToNext());


}else{



myDB.insertRow(dateFormat.format(date), getCowNum, 3.0);

Toast.makeText(getBaseContext(), getCowNum + " " + score30,
Toast.LENGTH_SHORT).show();
CowNum.clearFocus();
}
}

来 self 的 DBAdapter

            public Cursor dubUpCheck() {

Cursor c = db.query(DATABASE_TABLE, new String []{KEY_DATE, KEY_COW}, null, null,
null, null, null, null);
if (c != null) {
c.moveToFirst();
}

return c;

}

我需要检查是否有包含 dateFormat.format(date) 和 getCowNum 的行,但我似乎无法让它工作,不确定是否是由于我存储日期的方式所致,该日期是一个字符串dd-MM-yyyy的格式

    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
Date date = new Date();

像这样,输入数据但仍然允许重复

    public void onClick_30(View v) {

counter++;
cnt_bcs30++;

String getCowNum = CowNum.getText().toString();

Cursor C = myDB.dubUpCheck();
String ddate = C.getString(DBAdapter.COL_DATE);
String cow = C.getString(DBAdapter.COL_COW);


if(ddate == dateFormat.format(date) && cow == getCowNum){
Toast.makeText(getBaseContext(), getCowNum + "Has already been scored today ",
Toast.LENGTH_SHORT).show();
}else{



myDB.insertRow(dateFormat.format(date), getCowNum, 3.0);

Toast.makeText(getBaseContext(), getCowNum + " " + score30,
Toast.LENGTH_SHORT).show();
CowNum.clearFocus();
}

UPD:另一次尝试...我知道 else 语句在错误的位置,但我猜这并不是所有错误

        public void onClick_30(View v) {

counter++;
cnt_bcs30++;

String getCowNum = CowNum.getText().toString();

Cursor C = myDB.dubUpCheck();
String ddate = C.getString(DBAdapter.COL_DATE);
String cow = C.getString(DBAdapter.COL_COW);

if (C.moveToFirst()) {
do {
if (ddate.equals(dateFormat.format(date)) && cow.equals(getCowNum)) {

Toast.makeText(getBaseContext(),
getCowNum + "Has already been scored today ",
Toast.LENGTH_SHORT).show();

}

} while (C.moveToNext());
} else {

myDB.insertRow(dateFormat.format(date), getCowNum, 3.0);

Toast.makeText(getBaseContext(), getCowNum + " " + score30,
Toast.LENGTH_SHORT).show();
CowNum.clearFocus();
}
}

最佳答案

为什么不只是一个简单的WHERE

/** @return true if given date/cowNum combination is already in the db, false otherwise */
public boolean dubUpCheck(Date date, String cowNum) {
/* The 3rd parameter is treated as SQL WHERE clause, ? are replaced by strings
* from the 4th parameter */
Cursor cur = db.query(DATABASE_TABLE, null, "DATE = ? AND COW_NUM = ?", new String[] {dateFormat.format(date), getCowNum}, null, null, null, null);
if (cur != null && cur.getCount()>0) {
// duplicate found
return true;
}
return false;
}

UPD在您手动比较字符串的方法中,您犯了一个经典的 Java 菜鸟错误。您正在使用运算符 == 比较 String 对象:它会为不同的 [instances] 对象返回 false 实际上可能是内容相同(例如,这个 "foo"== new String("foo") 会给你 false)。您必须像这样使用 .equals():

ddate.equals(dateFormat.format(date)) && cow.equals(getCowNum)

但实际上,试试上面的方法,它创建的对象更少,并且会省去所有字符串比较的东西。

看来您可以从阅读一本关于 Java 的好书中获益 -- 例如Thinking in Java by Bruce Eckel是新手和中级 Java 开发人员最棒的读物之一

关于android - 在 SQLite 数据库中插入数据之前检查重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23887545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com