android.database.sqlite.SQLiteDatabase.rawQuery()没有使用SQLite datetime()函数更新DATETIME列

JD.*_*JD. 20 sqlite android date sql-update

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);
}
Run Code Online (Sandbox Code Playgroud)

我也试过传入datetime('now', '+7 days')作为绑定参数,这将无法工作,因为Android文档说:

这些值将绑定为字符串.

参考文献:

JD.*_*JD. 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();     
}
Run Code Online (Sandbox Code Playgroud)

虽然这是有道理的,但让我感到困惑的是调用的要求moveToFirst()(或某些其他功能以某种方式"与光标一起工作").
如果没有呼叫既moveToFirst()close(),该行从未更新. close()在它之后rawQuery(),什么也没做.

  • 谢谢,这是一个救生员!如果你问我,Android上的数据库处理真的很糟糕 (3认同)
  • 那很棒,关键点是moveToFirst(),我从插入记录中获取id后遇到了问题.通过在游标开始之前添加moveToFirst()来解决问题.看看这个; cr.moveToFirst(); int brandID = cr.getInt(cr.getColumnIndex(DatabaseTables.colBrandID)); (2认同)

Jab*_*ari 20

因为它是一个UPDATE声明,你可以使用execSQL()而不是rawQuery().你不必费心游戏(这对于一个UPDATE声明来说有点愚蠢).
但是,您必须在WHERE语句中放置值而不是传递args,因为execSQL()只接受SQL语句的单个String参数.此外,execSQL()是void类型.

execSQL()用于几乎所有的SQL语句,除了SELECT...