在SQLite数据库中插入数据之前检查副本

时间:2014-05-27 10:54:19

标签: android sqlite

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

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

我到目前为止...... 并且它不会向数据库输入任何数据

来自MainActivity

    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();
    }
}

来自我的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:另一次尝试......其他的声明是在我所知道的错误的地方,但这并不是所有的错误我在猜测

        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();
    }
}

1 个答案:

答案 0 :(得分:1)

为什么不只是一个简单的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比较==个对象:它将返回false,用于不同的[实例]对象,这些对象可能实际上是内容相同的(例如,{ {1}}会给你"foo" == new String("foo"))。你必须这样使用false

.equals()

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

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