Android SQLiteDatabase.delete方法不会使用args删除

时间:2011-09-01 17:18:14

标签: android

观看我如何调用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参数仅适用于表达式的右侧。

有人可以证实吗?

2 个答案:

答案 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数据库的一个很好的例子。