观看我如何调用db.delete
方法;如果我执行以下操作,则会成功删除记录:
public void deteleProfile(Long id) throws SQLException {
SQLiteDatabase db = helper.getWritableDatabase();
Integer i = db.delete(ProlificDatabase.TABLE, "_id=?", new String[] {id.toString()});
Log.d(TAG, i + " records deleted where id is " + id);
但是,如果我这样做:
public void deteleProfile(Long id) throws SQLException {
SQLiteDatabase db = helper.getWritableDatabase();
Integer i = db.delete(ProlificDatabase.TABLE, "?=?", new String[] {BaseColumns._ID,id.toString()});
Log.d(TAG, i + " records deleted where id is " + id);
没有记录被删除。也没有提出任何例外或警告来说出问题。
如果你没有抓住它,两个电话之间的区别是:
..."_id=?", new String[] {id.toString()});
VS
..."?=?", new String[] {BaseColumns._ID,id.toString()});
BaseColumns._ID的文档是:
带有public static final String _ID
的 Constant Value: "_id"
后一种方式似乎是为了更简洁的代码,但为什么它不起作用?
修改
我怀疑whereargs
参数仅适用于表达式的右侧。
有人可以证实吗?
答案 0 :(得分:2)
您在whereArgs
中提供的字符串将被转义并包含在“
"?=?", new String[] {BaseColumns._ID,id.toString()});
转换为
'_id'='1234'
这是有效的SQLite语法,但是进行字符串比较而不是表查找。由于“_id”与“1234”(或任何其他数字)不是相同的字符串,因此表达式将始终评估为false,并且不会删除任何内容。
您应该使用以下语法
Integer i = db.delete(ProlificDatabase.TABLE, BaseColumns._ID + "=?", new String[] {id.toString()});
答案 1 :(得分:0)
public void deteleProfile(Long id) throws SQLException
{
SQLiteDatabase db = helper.getWritableDatabase();
Integer i = db.delete(ProlificDatabase.TABLE, "_id=" + id, null);
Log.d(TAG, i + " records deleted where id is " + id);
}
和this link是android的SQLite数据库的一个很好的例子。