android.database.sqlite.SQLiteDatabase.rawQuery () non sta aggiornando una colonna DATETIME con una funzione datetime () di SQLite

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

Ho anche provato a passare in datetime('now', '+7 days') come parametro associato, che non funzionerà, come dice la documentazione di Android :

I valori saranno associati come stringhe.

Riferimenti:

  • http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html
  • http://www.sqlite.org/lang_datefunc.html

Il cursore non è stato chiuso.

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

Anche se ciò ha senso, ciò che davvero mi imbarazza è l’esigenza di chiamare moveToFirst() (o qualche altra funzione che “lavorerebbe” con il cursore in qualche modo).
Senza la chiamata a moveToFirst() e close() , la riga non è mai stata aggiornata. close() da solo, dopo rawQuery() , non ha fatto nulla.

Poiché si tratta di un’istruzione UPDATE , è ansible utilizzare execSQL() anziché rawQuery() . Non dovresti preoccuparti dei cursori (che è piuttosto sciocco per un’istruzione UPDATE ).
Tuttavia, dovrai inserire valori nella tua istruzione WHERE invece di passare argomenti, dato che execSQL() accetta solo un singolo argomento String per la tua istruzione SQL. Inoltre, execSQL() è di tipo void.

Io uso execSQL() per quasi tutte le istruzioni SQL tranne SELECT