私の意図: SQLiteカラムの値をインクリメントしようとしています。列のタイプは「REAL」です。SQLite: "real"タイプの値を増やす
問題: (UPDATEを使用して)増分を実行しているときに何も起こらず、列が更新されていません。私はカーソルmCount、mPosとmRowIdColumnIndexに-1を取得します。
私の捜査:初期値がNULLのときに "real"という型の値を増やすことができないので、私のdbをPCにインポートして開き、SQLite Database Browserで開きました。 "myColumn実際のDEFAULT 0.0 "を私のテーブル作成メソッドに追加します。これにより、0.0に値が設定され、後で増やすことができます。
SQLiteQuery:
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;
}
UPDATEがSETスコア=(スコア+ 1.0)stock_id = 35 AND t_id = 1つの
マイテーブル構造をts_stocksこのコードは上記のSQLを作成します:
UPDATE ts_stocks SET score =(スコア+ 1.0)where_inst_id = 35 AND t_id = 1
実行中のアプリケーションデバッガから取得したものです。ダウンロードしたDB WORKSでこのSQL文を使用すると、正しい方法で「スコア」が増分されます。
誰かが私が間違っていることを知っていますか?
おかげで、D
なぜ私はrawQueryを使用しないでください。 execSQLの利点は何ですか?私はドキュメントを読んだが、BよりもAを好む理由についての情報は見当たらなかった。また、SQLiteStatementが私に与えるメリットの理解も不足している。それについていくつかの情報を教えてください。どうもありがとう! :) – roysch
主な理由は、rawQueryは実際にあなたのUPDATE/INSERTやDELETEを実行しないということです。SQLiteStatementは、データを適切にエスケープしてバインドするプリフォーマット、プリコンパイル、再利用可能なSQL文です。あなたのSQLクエリをコンパイルする必要はありません。データバインディング=文字列などの不正な文字のエスケープSQLiteOpenHelperにCREATE TABLEステートメントを記述しない限り、生のSQLを使用しないようにするのは良い習慣です。 SDKクラスのDatabaseUtils.InsertHelperは、内部的にSQLiteStatmentsを使用します。 – Jens
貴重な情報ありがとうございます。私は自分のコードを変更し、来るべき世代の結果をコミュニティに知らせます。 – roysch