2015-01-04 3 views
1

값에 아포스트로피가 포함 된 sqlite 테이블에 대한 insert 문이 있습니다.SQLite에서 단일 인용 부호를 올바르게 이스케이프하는 방법 insert 문 - iOS

NSString *sqlInsert = [NSString stringWithFormat:@"insert into myTable (_id, name, area, title, description, url) VALUES (%i, '%@', '%@', '%@', '%@', '%@')", tempObject.ID, tempObject.name, tempObject.area, tempObject.title, tempObject.description, tempObject.url]; 

해당 문자열의 결과는 내가 테이블에 그것을 삽입하려고하면이

insert into myTable (_id, name, area, title, description, url) VALUES (0, 'John Smith', 'USA', 'Programmer', 'John Smith is a programmer. He programs a lot. John Smith's duty is to program. He loves it. His dog's name is Billy.', 'www.google.com') 

, 내가 "S"근처에 구문 오류가 있습니다. 나는 아포스트로피를 제대로 피하고 싶다. 그 일을 어떻게 하죠? 고마워, 어떤 통찰력을 주셔서 감사합니다!

편집 : 우리는이 문제를 해결했습니다. 우리는 곱슬 곱슬 한 따옴표를 원했던 문자열에 작은 따옴표 (')를 입력했습니다. 둥근 작은 따옴표는 SQLite 삽입 문을 사용하지 않습니다. 이 문제가있는 사람들은 정규 작은 따옴표 대신에 단일 곱슬 따옴표를 사용할 수 있습니다. 이것은 상황에 따라 가능하지 않을 수도 있지만 일부 경우 간단한 해결책이 될 수 있습니다.

+1

는 쿼리를 작성하는'stringWithFormat'를 사용하지 마십시오. 'sqlite3_bind_xxx' 문장으로 올바르게 처리하십시오. – rmaddy

+0

이 답변보기 http://stackoverflow.com/questions/17855029/insert-special-character-in-sqlite/17855164#17855164 – rmaddy

답변

3

데이터에 작은 따옴표가 들어 있습니다. 이 문제를 극복하기위한 두 가지 방법이 있습니다.

  1. 값 (나는이 방법을 선호) 바인딩 \'
  2. 사용 sqlite3_bind_xxx() 방법으로 탈출 '. 당신은 그것을 좋아 할 수 있습니다 :


NSString *sqlInsert = @"insert into myTable (_id, name, area, title, description, url) VALUES (?, ?, ?, ?, ?, ?)"; 
if (sqlite3_open([yourDBPath UTF8String], &yourDB) == SQLITE_OK) 
{ 
    if (sqlite3_prepare_v2(yourDB, sql, 1, &stmt, NULL) == SQLITE_OK) 
    { 
     sqlite3_bind_int(stmt, 1, tempObject.ID); 
     sqlite3_bind_text(stmt, 2, [tempObject.name UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(stmt, 3, [tempObject.area UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(stmt, 4, [tempObject.title UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(stmt, 5, [tempObject.description UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(stmt, 6, [tempObject.url UTF8String], -1, SQLITE_TRANSIENT); 
     // Execute 
    } 
} 
+0

누군가가'sqlite3_bind_xxx'의 열 인덱스가 1 기반이지만 열 인덱스 'sqlite3_column_xxx'는 0 기반입니까? 나를 미치게한다 (미안하다.) :) – rmaddy

+0

@rmaddy 'sqlite3_bind_xxx'도 명명 된 매개 변수에 대해 작동해야하고'sqlite3_bind_parameter_index'는 오류 코드로 0을 반환합니다 (일치하는 매개 변수가없는 경우). –

+2

SQL에서 작은 따옴표는 백 슬래시로 이스케이프되지 않습니다. –

관련 문제