0

我的意图:我正在尝试增加 SQLite 列中的值。该列的类型为“REAL”。

问题:当我执行递增(使用 UPDATE)时,什么也没有发生,并且列没有被更新。我在游标 mCount、mPos 和 mRowIdColumnIndex 上得到 -1。

我的调查:我发现(通过将我的数据库导入 PC 并使用 SQLite 数据库浏览器打开它)当初始值为 NULL 时,我无法增加“真实”类型的值,所以我添加了“myColumn real DEFAULT 0.0”到我的表创建方法。这会将值设置为 0.0,以后可以递增。

SQLiteQuery: UPDATE ts_stocks SET score= (score + 1.0) WHERE stock_id=35 AND t_id=1

我的表结构:

create table ts_stocks (_id integer primary key autoincrement,
        t_id integer, 
        stock_id integer,
        score real DEFAULT 0.0,
        datetime text not null,
        FOREIGN KEY(t_id) REFERENCES ts(_id) ON DELETE CASCADE ON UPDATE CASCADE);  
        FOREIGN KEY(stock_id) REFERENCES stocks(_id) ON DELETE CASCADE ON UPDATE CASCADE);

我的代码:

public Cursor updateParticipantScore(TParticipant tParticipant, Long tId)
{
    String queryUpdateParticipantScore = "UPDATE " +
            StConstants.TblTsStocks.TBL_TS_STOCKS_NAME +
            " SET " +
            StConstants.TblTsStocks.TBL_COLUMN_TS_STOCKS_STOCK_SCORE +
            "= (" + 
            StConstants.TblTsStocks.TBL_COLUMN_TS_STOCKS_STOCK_SCORE + 
            " + " + 
            tournamentParticipant.getScore() +
            ") WHERE " + 
            StConstants.TblTsStocks.TBL_COLUMN_TS_STOCKS_STOCK_ID +
            "=" +
            tParticipant.getStock().getId() +
            " AND " +
            StConstants.TblTsStocks.TBL_COLUMN_TS_STOCKS_TOURNAMENT_ID +
            "=" +
            tId;

    Cursor resultSetCursor = mDb.rawQuery(queryUpdateParticipantScore, null);

    return resultSetCursor;
}

此代码创建上述 SQL:

更新 ts_stocks SET score= (score + 1.0) WHERE stock_id=35 AND t_id=1

取自正在运行的应用程序调试器。在下载的 db WORKS 上使用此 SQL 语句 - 它以正确的方式增加“分数”。

任何人都知道我做错了什么?

感谢:D

4

2 回答 2

2

你不应该使用更新rawQuery

mDb.rawQuery(queryUpdateParticipantScore, null);

尝试:

mDb.execSQL(queryUpdateParticipantScore);

甚至更好的是,格式化一次查询,创建一个SQLiteStatement并绑定您的参数,如下所示

static final String UPDATE_PARTICIPANTS_SCORE = "UPDATE " +
            StConstants.TblTsStocks.TBL_TS_STOCKS_NAME +
            " SET " +
            StConstants.TblTsStocks.TBL_COLUMN_TS_STOCKS_STOCK_SCORE +
            "= (" + 
            StConstants.TblTsStocks.TBL_COLUMN_TS_STOCKS_STOCK_SCORE + 
            " + ?) WHERE " + 
            StConstants.TblTsStocks.TBL_COLUMN_TS_STOCKS_STOCK_ID +
            "=? AND " +
            StConstants.TblTsStocks.TBL_COLUMN_TS_STOCKS_TOURNAMENT_ID +
            "=?";
SQLiteStatement mUpdateParticipantsScoreStatement;

public .. whereEverYouInitializeYourStuff() {
    mUpdateParticipantsScoreStatement = mDb.compileStatement(UPDATE_PARTICIPANTS_SCORE);
}

public int updateParticipantScore(TParticipant tParticipant, Long tId)
{
    mUpdateParticipantsScoreStatement.bindDouble(1, tParticipant.getScore());
    mUpdateParticipantsScoreStatement.bindLong(2, tParticipant.getStock().getId());
    mUpdateParticipantsScoreStatement.bindLong(3, tId);
    return mUpdateParticipantsScoreStatement.executeUpdateDelete();
}
于 2012-05-11T12:00:34.700 回答
0

谢谢 Jens - 我改为:

mDb.execSQL(queryUpdateParticipantScore); 

现在它正在工作,所以我的 SQL 语法基本上是正确的。几天后,当我有时间检查所有代码时,我打算将其更改为使用

SQLiteStatement

非常感谢你教会了我一些新东西!D.

于 2012-05-12T22:39:18.160 回答