android.database.sqlite.SQLiteDatabase.rawQuery()未使用sqlite DATETIME()函数更新日期时间列
我还尝试将android.database.sqlite.SQLiteDatabase.rawQuery()未使用sqlite DATETIME()函数更新日期时间列,android,sqlite,date,sql-update,Android,Sqlite,Date,Sql Update,我还尝试将datetime('now','+7天')作为绑定参数传递,但这不起作用,如所述: 这些值将被绑定为字符串 参考资料: 光标未关闭 public Cursor set_datetime_next(Reminder r) { String _newVal = "datetime('now', '+7 days')"; String[] args = { new Integer(r.getID()).toString() }; String qu
datetime('now','+7天')
作为绑定参数传递,但这不起作用,如所述:
这些值将被绑定为字符串
参考资料:
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);
}
虽然这是有道理的,但真正让我困惑的是调用moveToFirst()
(或以某种方式“使用”光标的其他函数)的要求。如果不同时调用
moveToFirst()
和close()
,则该行永远不会更新close()
在rawQuery()
之后,它本身什么也没做。因为它是一个UPDATE
语句,所以您可以使用execSQL()
而不是rawQuery()
。您不必为游标而烦恼(对于UPDATE
语句来说,这有点傻)。但是,您必须在
WHERE
语句中放置值,而不是传递参数,因为execSQL()
只接受SQL语句的单个字符串参数。另外,execSQL()
的类型为void
我使用
execSQL()
来处理几乎所有的SQL语句,除了SELECT
。是_newval:datetime('now','+7天')还是“datetime('now','+7天')”?嗨,Guido,我已经更新了代码示例来回答你的问题。我已经将返回代码更改为void,因为调用方没有理由使用结果集。谢谢,这是一个救命恩人!Android上的db处理实现得非常糟糕,如果你问我这是多么出色,关键是moveToFirst(),我从插入的记录中获取id后遇到了问题。通过在光标开始之前添加moveToFirst()解决了这个问题。看这个,;cr.moveToFirst();int brandID=cr.getInt(cr.getColumnIndex(DatabaseTables.colBrandID));哎呀,那愚蠢的第一步一整天都在折磨我!谢谢你救了我的命。这很有帮助。虽然moveToFirst()
对我来说毫无意义,但它完成了工作。这应该是公认的答案,比rawQuery对这种情况更直观。
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();
}