2011-09-01 62 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 =?'起作用的原因。 –