내 의도 : 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
왜 rawQuery를 사용하지 않아야합니까? execSQL의 장점은 무엇입니까? 나는 문서를 읽었지만 B에 대해 왜 A를 선호하는지에 대한 정보를 볼 수 없었다. SQLiteStatement가 나에게주는 이점에 대한 이해 또한 부족하다. 그것에 관한 정보를 공유해 주시겠습니까? 많은 감사합니다! :) – roysch
주된 이유는 rawQuery가 실제로 UPDATE/INSERT 또는 DELETE를 수행하지 않기 때문입니다.SQLiteStatements는 데이터를 올바르게 이스케이프/바인드하는 사전 형식화 된 사전 컴파일 된 SQL 문이며 다시 사용할 수있는 SQL 문입니다. SQL 쿼리를 계속해서 컴파일하지 않아도 성능은 향상됩니다. 데이터 바인딩 = 문자열 등에서 잘못된 문자를 이스케이프 처리 SQLiteOpenHelper에 CREATE TABLE 문을 쓰지 않는 한 원시 SQL을 사용하지 않는 것이 좋습니다. SDK 클래스의 DatabaseUtils.InsertHelper는 내부적으로 SQLiteStatments를 사용합니다. – Jens
귀중한 정보에 감사드립니다. 코드를 변경하고 커뮤니티가 앞으로의 세대에 대한 결과를 알리도록하겠습니다. – roysch