2011-08-08 36 views
20
public Cursor set_datetime_next(Reminder r) {  
    String _newVal = "datetime('now', '+7 days')"; 
    String[] args = { new Integer(r.getID()).toString() }; 
    String query = 
     "UPDATE " + DBConst.TABLE 
     + " SET " + DBConst.f_DATETIME_NEXT + "=" + _newVal 
     + " WHERE " + DBConst.f_ID +"=?"; 
    Log.i(TAG, query); 
    return db.rawQuery(query, args); 
} 

我還試圖在datetime('now', '+7 days')通過作爲綁定參數,這是行不通的更新DATETIME列,作爲Android documentation說:android.database.sqlite.SQLiteDatabase.rawQuery()不與一個SQLite日期時間()函數

這些值將被綁定爲字符串。

參考文獻:

+0

是* _newval *:*日期時間( '現在', '7天')*或*「日期時間( '現在',' +7天')「*? –

+0

嗨Guido,我已經更新了代碼示例來回答你的問題。 –

回答

54

光標沒有關閉。

public void set_datetime_next(Reminder r, String _newVal) {  
    String[] args = { new Integer(r.getID()).toString() }; 
    String query = 
     "UPDATE " + DBConst.TABLE 
     + " SET " + DBConst.f_DATETIME_NEXT + "=" + _newVal 
     + " WHERE " + DBConst.f_ID +"=?"; 
    Log.i(TAG, query); 
    Cursor cu = db.rawQuery(query, args); 
    cu.moveToFirst(); 
    cu.close();  
} 

雖然是有道理的,真正困擾我的是調用moveToFirst()的要求(或其他一些功能,將光標以某種方式「一起工作」)。
沒有呼叫moveToFirst()close(),行從未更新。 close()本身,在rawQuery()之後,什麼都沒做。

+0

無論如何,我已經將返回碼更改爲void,因爲調用者沒有理由使用結果集。 –

+0

真棒,救了我。你應該接受你自己的答案。 – orip

+3

謝謝,這是一個救星!如果你問我,在Android上處理數據庫真的很糟糕+1 – slinden77

20

由於這是一個UPDATE聲明,您可以使用execSQL()而不是rawQuery()。你不必打擾遊標(這對於UPDATE陳述來說有點愚蠢)。
但是,您必須將值放入您的WHERE語句中,而不是傳遞參數,因爲execSQL()只接受SQL語句的單個字符串參數。另外,execSQL()是void類型。

我用execSQL()除外SELECT幾乎所有的SQL語句...

+0

到目前爲止,這應該是被接受的答案,對於這種情況,它比rawQuery更直觀。 –