我通过单击按钮将 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/