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

Emm*_*mma 1 java sqlite android

我试图第一次从SQLite中的表中删除一行,我想我已经按照教程并将其改编为我的应用程序,但我已经把语法搞砸了.

这是代码 DatabaseHelper.java

public void deleteRow (String subject) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.execSQL("delete from " + TABLE_NAME +" where " + COL_2 + "=" + subject);
}
Run Code Online (Sandbox Code Playgroud)

以及从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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*sen 5

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

delete from TABLE_NAME where COL_2 = some_subject
Run Code Online (Sandbox Code Playgroud)

换句话说,你是比较COL_2反对some_subject,这SQLite的将其解释为一列,而不是作为一个字符串.以下是您要运行的查询:

delete from TABLE_NAME where COL_2 = 'some_subject'
Run Code Online (Sandbox Code Playgroud)

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

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
}
Run Code Online (Sandbox Code Playgroud)

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