0

私の意図:SQLite列の値をインクリメントしようとしています。列のタイプは「REAL」です。

問題:インクリメントを実行しているとき(UPDATEを使用)、何も起こらず、列が更新されていません。カーソルmCount、mPos、およびmRowIdColumnIndexで-1を取得します。

私の調査:(データベースをPCにインポートしてSQLiteデータベースブラウザで開くことにより)初期値がNULLの場合、タイプ「real」の値をインクリメントできないことがわかったので、「myColumnrealDEFAULT0.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を作成します。

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

実行中のアプリケーションデバッガーから取得。ダウンロードしたdbWORKSでこのSQLステートメントを使用すると、正しい方法で「スコア」が増加します。

誰かが私が間違っていることの手がかりを持っていますか?

ありがとう

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 に答える