2011-09-01 152 views
0

观看我如何调用db.delete方法;如果我下面的记录被成功删除:Android SQLiteDatabase.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 _IDConstant Value: "_id"

后一种方式似乎为更整洁的代码,但为什么它不工作?

编辑: 我怀疑whereargs参数仅适用于表达式的右侧。

有人可以证实这一点吗?

回答

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()}); 
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); 
    } 

and this link是android的SQLite数据库的一个很好的例子。

+0

我的问题是,为什么这里使用args参数不干活已经知道如何删除行;-) –

+0

你有没有在增加一列_id您表? –

+0

是的,这就是为什么第一个示例'_id =?'起作用的原因。 –