按下删除按钮时,SQLite表行不删除,android

时间:2018-01-06 07:31:03

标签: java android sqlite

我第一次尝试从 SQLite 中的表中删除一行,我以为我已经按照教程调整并将其调整到我的应用程序但我搞砸了语法某处。

以下是DatabaseHelper.java

的代码
public void deleteRow (String subject) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.execSQL("delete from " + TABLE_NAME +" where " + COL_2 + "=" + subject);
}

从SubjectActivity.java调用它的代码:

public void onClick(View view) {
    if(view.getId()==R.id.deleteSubject) {
        Bundle extras = getIntent().getExtras();
        String subject = extras.getString("subject");
        myDb.deleteRow(subject);
    }
}

在主题活动中按下删除按钮时应该删除该行,但是当我按下按钮时,应用程序强制关闭。我在语法中缺少什么?

2 个答案:

答案 0 :(得分:5)

这是您当前传递给SQLite的原始查询的样子:

delete from TABLE_NAME where COL_2 = some_subject

换句话说,您正在将COL_2some_subject进行比较,SQLite将其解释为列,而不是字符串文字。以下是您要运行的查询:

delete from TABLE_NAME where COL_2 = 'some_subject'

这里最好的解决方法是使用预准备语句,其中查询具有主题字符串的位置参数(?)。该声明将自动代表您转义字符串。

public void deleteRow (String subject) {
    SQLiteDatabase db = this.getWritableDatabase();
    String sql = "DELETE FROM " + TABLE_NAME + " WHERE " + COL_2 + " = ?";
    SQLiteStatement statement = db.compileStatement(sql);
    statement.bindString(1, subject);

    int numRowsDeleted = statement.executeUpdateDelete();
    // you might want to check the number of records which were actually deleted
}

请注意,为给定语句创建表和列名称变量并不常见。相反,您通常会看到这些是硬编码的。这样做的原因是,您不太可能希望在不同的表或同一个表上运行相同的语句,但具有不同的列。

答案 1 :(得分:-1)

检查以下代码

minimize/1