2012-05-11 4 views
0

내 의도 : SQLite 열의 값을 증가 시키려고합니다. 열의 유형이 "REAL"입니다.SQLite : "real"유형의 값 증가

문제 : (UPDATE를 사용하여) 증분을 수행 할 때 아무 일도 일어나지 않고 열이 업데이트되지 않습니다. 커서 mCount, mPos 및 mRowIdColumnIndex에 -1이 표시됩니다.

내 조사 :초기 값이 NULL 일 때 "real"유형의 값을 증가시킬 수 없다는 사실을 PC에 가져 와서 SQLite Database Browser에서 열어 보았습니다. 그래서 "myColumn 진짜 DEFAULT 0.0 "내 테이블 만들기 방법. 이 값을 0.0으로 설정하면 나중에 값을 증가시킬 수 있습니다.

SQLiteQuery : UPDATE가 SET ts_stocks 점수 = (점수 + 1.0) 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 점수 = (점수 + 1.0) 어디 재고 _id = 35 AND t_id = 1

실행중인 응용 프로그램 디버거에서 가져온 것과 같습니다. 다운로드 된 DB WORKS에서이 SQL 문을 사용하면 올바른 방식으로 "점수"를 증가시킵니다.

누구나 내가 뭘 잘못하고 있는지 알 수 있습니까?

mDb.execSQL(queryUpdateParticipantScore); 
더 나은

또는 한 번 쿼리를 포맷하는 SQLiteStatement 및 바인드를 만듭니다 rawQuery

mDb.rawQuery(queryUpdateParticipantScore, null); 

시도하여

감사, D

답변

2

당신은 일을하지 말아야 업데이트 당신의 주장 이런 식으로 :

-
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를 수행하지 않기 때문입니다.SQLiteStatements는 데이터를 올바르게 이스케이프/바인드하는 사전 형식화 된 사전 컴파일 된 SQL 문이며 다시 사용할 수있는 SQL 문입니다. SQL 쿼리를 계속해서 컴파일하지 않아도 성능은 향상됩니다. 데이터 바인딩 = 문자열 등에서 잘못된 문자를 이스케이프 처리 SQLiteOpenHelper에 CREATE TABLE 문을 쓰지 않는 한 원시 SQL을 사용하지 않는 것이 좋습니다. SDK 클래스의 DatabaseUtils.InsertHelper는 내부적으로 SQLiteStatments를 사용합니다. – Jens

+0

귀중한 정보에 감사드립니다. 코드를 변경하고 커뮤니티가 앞으로의 세대에 대한 결과를 알리도록하겠습니다. – roysch

0

감사 옌스 나는 변경 :

mDb.execSQL(queryUpdateParticipantScore); 

지금은 노력하고, 그래서 내 SQL 구문은 기본적으로 정확했다. 내 모든 코드를 통해 갈 시간이있을 때 몇 일에서 는, 나는 그것이 나에게 새로운 것을 가르치기위한

SQLiteStatement 

많은 감사를 사용하도록 변경하려는! D.