为什么这样的DELETE查询不起作用?

时间:2014-03-18 19:19:59

标签: android sql sqlite

这是我从数据库中删除一行的方法,其中appointment_date等于传入的日期

public void deleteAllAppointments(String date) {
        SQLiteDatabase db = this.getWritableDatabase();

        String deleteAllQuery = "DELETE FROM " + TABLE_APPOINTMENTS + " WHERE appointment_date = '" + date + "'";
        db.rawQuery(deleteAllQuery, null);
        Log.d("Query: ", deleteAllQuery);
    }

然后我就像这样使用它

    //Database (DatabaseHandler is the one that contains all database methods)
    final DatabaseHandler database = new DatabaseHandler(this);

    //This happens when button is clicked, it is tested an executes with every chick,   
    //@param selectedDate is a string like "18/03/2014"

    database.deleteAllAppointments(selectedDate);

执行和查询看起来像这样

DELETE FROM appointments WHERE appointment_date = '18/03/2014'

然而,行与约会_日期=' 18/03 / 2014'未删除。

我确定数据库设置正确,因为我有工作方法,所有信息都以正确的格式从那里收到。

注意:添加" *"到" DELETE * FROM ..."返回致命的语法错误。

3 个答案:

答案 0 :(得分:3)

rawQuery()只编译SQL但不运行它。要实际运行它,请使用execSQL()或调用moveTo...()返回的游标上的rawQuery()方法之一。

有关详细信息,请参阅What is the correct way to do inserts/updates/deletes in Android SQLiteDatabase using a query string?

答案 1 :(得分:1)

对于插入或删除等任务,有非常好的方便方法"比如已经内置到数据库中的[delete method](http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#delete(java.lang.String,java.lang.String,java.lang.String []))。

public int delete (String table, String whereClause, String[] whereArgs)

至于为什么你当前的方法会失败,你可能会尝试删除不匹配的列的格式(例如,你已经将表创建为日期值而不是字符串)。

在任何情况下,使用内置的删除方法都比较容易,因为它会在失败时通过返回受删除影响的行数来通知您。 rawQuery只返回一个游标,然后您必须从中获取结果以查看它是否有效。

答案 2 :(得分:1)

您确定自己的数据值是day/month/year ala的欧洲格式,您的查询值为18/03/2014,而且可能不是美国风格的month/day/year03/18/2014

不是试图以美国为中心,但这是我的第一个想法。

否则,请务必查看SQLiteDatabase.delete

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#delete(java.lang.String,java.lang.String,java.lang.String [])