2012-05-11 16 views
0

私の意図: 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

答えて

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(); 
} 
+0

なぜ私はrawQueryを使用しないでください。 execSQLの利点は何ですか?私はドキュメントを読んだが、BよりもAを好む理由についての情報は見当たらなかった。また、SQLiteStatementが私に与えるメリットの理解も不足している。それについていくつかの情報を教えてください。どうもありがとう! :) – roysch

+0

主な理由は、rawQueryは実際にあなたのUPDATE/INSERTやDELETEを実行しないということです。SQLiteStatementは、データを適切にエスケープしてバインドするプリフォーマット、プリコンパイル、再利用可能なSQL文です。あなたのSQLクエリをコンパイルする必要はありません。データバインディング=文字列などの不正な文字のエスケープSQLiteOpenHelperにCREATE TABLEステートメントを記述しない限り、生のSQLを使用しないようにするのは良い習慣です。 SDKクラスのDatabaseUtils.InsertHelperは、内部的にSQLiteStatmentsを使用します。 – Jens

+0

貴重な情報ありがとうございます。私は自分のコードを変更し、来るべき世代の結果をコミュニティに知らせます。 – roysch

0

おかげイェンス - 私のように変更:

mDb.execSQL(queryUpdateParticipantScore); 

今では働いているので、私のSQL構文は、基本的に正しかったです。私は私のコードのすべての上に行くには時間があるとき、数日で は、私はそれが私に新しい何かを教えるため

SQLiteStatement 

感謝を使用するように変更するつもり! D.

関連する問題