作者:lewis_and_his_wife_480 | 来源:互联网 | 2023-01-02 15:26
我试图第一次从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);
}
}
在主题活动中按下删除按钮时应该删除该行,但是当我按下按钮时,应用程序强制关闭.我在语法中缺少什么?
1> Tim Biegelei..:
这是您当前传递给SQLite的原始查询的样子:
delete from TABLE_NAME where COL_2 = some_subject
换句话说,你是比较COL_2
反对some_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
}
请注意,为给定语句创建表和列名称变量并不常见.相反,您通常会看到这些是硬编码的.这样做的原因是,您不太可能希望在不同的表或同一个表上运行相同的语句,但具有不同的列.