2011-12-14 2 views
1

이상한 문제가 발생했습니다.sqlite가 바뀌지 않습니다.

NSString *sql = @"CREATE TABLE IF NOT EXISTS user_results (id INTEGER PRIMARY KEY ASC AUTOINCREMENT, gameID INTEGER UNIQUE, gameDesc TEXT, result INTEGER)"; 

가 그럼 난 쿼리를 실행합니다 : 내 목표 - C 응용 프로그램에서 SQLite는 테이블이

[[DatabaseController getInstance].resultsDB executeUpdate:@"REPLACE INTO user_results (gameID, gameDesc, result) VALUES (?, ?, ?)",[NSNumber numberWithInt:self.gameID],[test JSONRepresentation],[NSNumber numberWithInt:sumBalls]]; 

을 그러나 문제는이 같은 gameID으로 행을 대체하지 않습니다, 그것은 단지 1을 추가합니다 (비록 그것이 UNIQUE 임), 어떤 아이디어가 발생합니까?

P. FMDB를 사용하여 sqlite를 사용하고 있습니다.

미리 감사드립니다.

솔루션 :는 SQL 쿼리를 보낼 때 [NSNumber numberWithInt:self.gameID] 대신 [NSNumber numberWithInt:self.gameID].integerValue를 사용했다.

답변

0

gameID 필드는 PRIMARY KEY, ID이 아닙니다. 가지고 계신대로 REPLACE INTOID 필드에서만 작동합니다. gameID 필드를 기본 키로 사용하여 원하는 결과를 얻을 것을 권장합니다.

NSString *sql = @"CREATE TABLE IF NOT EXISTS user_results (gameID INTEGER PRIMARY KEY, gameDesc TEXT, result INTEGER)"; 
+0

는 아니, 게임 ID는 고유 한 열이 이미 있으므로 INTO가 잘 작동하고 고유하지 않은 만들 것 행을 삭제해야 REPLACE입니다. –

+0

사실입니다. UNIQUE 열을 덮어 써서는 안되기 때문에 INSERT 대신 REPLACE를 호출해야합니다. –

2

나중에 UNIQUE 제약 조건이 추가되어 스키마가 변경 되었습니까? 귀하의 스키마 & SQL이 예상대로 작동해야합니다. ,

replace into user_results (gameid, result) values (2, 3); 
select * from user_results; 
1|1|hi|1 
3|2||3 

그것은 ID 2 행을 삭제 : 난 그냥이 시도하고 그것을 잘 작동합니다 :

sqlite3 
CREATE TABLE IF NOT EXISTS user_results (id INTEGER PRIMARY KEY ASC AUTOINCREMENT, gameID INTEGER UNIQUE, gameDesc TEXT, result INTEGER); 
insert into user_results values (1,1,'hi', 1); --insert 2 test rows 
insert into user_results values (2,2,'2', 2); 
select * from user_results; 

1|1|hi|1 
2|2|2|2 

지금 삽입 실패 :

insert into user_results values (3,1,'1', 1); 
Error: column gameID is not unique 

은 INTO 당신이 무엇을 기대합니까 교체 새로운 행 ID 3 및 gameid 2로 바 꾸었습니다. 기본 키 = 2 행을 대체 할 것으로 예상하지 않는 한? Sqlite가하는 일은 고유 키를 위반하게 만들 이전 행을 삭제 한 다음 새 행을 삽입하는 것입니다. http://www.sqlite.org/lang_conflict.html을 참조하십시오. EXTRA 행을 추가하지 않았습니다. 그것은 하나를 삭제 한 (즉, '대체':

귀하의 경우에는 SQL로 대체 id 컬럼, 즉 I 효과적으로 ID 3. 물론 당신 '로 행을 업데이트하고있어, 여기 일하는 것이 포함 추가 교체 할 행의 ID를 알아 내야합니다 ...

replace into user_results values (3,3,'2', 2); 
select * from user_results; 
1|1|hi|1 
3|3|2|2 

id 열은 정말로 신경 써주시겠습니까? Sqlite는 그런 열을 여러분을 위해 만들어 줄 것입니다.

+0

나는 실제로 문제를 발견했다. [NSNumber numberWithInt : sumBalls]를 executeUpdate로 보내려고하면 실제 sumBalls 값을 보내지 않았습니다. '[NSNumber numberWithInt : self.gameID] .integerValue' 트릭을했습니다. 감사. –

관련 문제