2011-08-08 14 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.database.sqlite.SQLiteDatabase.rawQueryは()<a href="http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html" rel="noreferrer">Android documentation</a>として、機能しませんSQLiteの日時()関数

値は文字列としてバインドされます。

参考文献:

+0

がある* _newval *:*日時( '今'、 '7日間')*または*「日時( '今'、 ' +7日) "*? –

+0

こんにちは、私はあなたの質問に答えるためのコードサンプルを更新しました。 –

答えて

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でのdbの処理は実際には難しいです – slinden77

20

ステートメントのため、rawQuery()ではなくexecSQL()を使用できます。あなたはカーソルで気にする必要はありません(UPDATEステートメントではまあまあです)。
execSQL()はSQL文のための単一の文字列引数を受け入れるだけであるため、argsを渡す代わりにWHERE文に値を配置する必要があります。また、execSQL()はvoid型です。私はSELECT除くちょうど約すべてのSQL文にexecSQL()を使用

...

+0

これは受け入れられた答えであり、これはrawQueryよりも直感的です。 –