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

标签 android sqlite

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

相关文章:

android - Google C2D_MESSAGE 应用程序未定义权限?

android - com.google.android.maps 不存在奇怪的错误

mysql - 将SQLite请求中的strftime转换为MySQL

c++ - 无法从 SQLite3 表中删除记录

python - Qt:从一个 QSqlTableModel 在两个 QListView 之间移动条目

golang 中的 sqlite3,foreign_keys pragma 不强制键

shell - sqlite3 shell 命令 '.backup' 和事务

Android 操作栏 SearchView 作为自动完成?

android - 如何在Android中实现恢复/暂停录音?

java - Activity setTitle 与 Toolbar setTitle 有什么区别