2013-08-06 2 views
1

내 sqlite 데이터베이스에 일부 값을 삽입하려합니다. db는 이미 전화의 doc 폴더에 있습니다. 나는 잘못되어 가고있는 것을 파악할 수 없다. 추적을 실행하도록 설정했지만 db는 오류가 없음을 알려줍니다. 누군가 나를 도울 수 있습니까?iOS : SQLite 삽입 쿼리가 작동하지 않습니다.

if([[TRSharedLocalDatabase openDatabase] executeUpdateWithFormat:@"INSERT INTO event (title,date,address,latitude,longitude,location,facebookID,picPath,description) VALUES (%@,%@,%@,%@,%@,%@,%@,%@,%@)",event.title ,event.date, event.address, [NSNumber numberWithDouble:event.geoPoint.longitude], [NSNumber numberWithDouble:event.geoPoint.latitude], event.location.objectId, event.facebookID ,picPath ,event.description]) {  
    NSLog(@"Ok"); 
} else { 
    NSLog(@"Not Ok"); 
} 

+(FMDatabase *)openDatabase { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"4PartyLocalSystem.sqlite"]; 
    **FMDatabase *database = [FMDatabase databaseWithPath:writableDBPath];** 
    [database open]; 
    [database setTraceExecution:YES]; 
    return database; 
} 

2013년 8월 6일 13 : 21 : 42.499 4Party [13018 : 907] executeUpdate의 이벤트 INSERT INTO (제목, 날짜, 주소, 위도, 경도, 위치 facebookID, picPath, 설명) VALUES

+2

라파엘, 그것은 도움이 될 것입니다. 메소드'openDatabase'에 대한 코드를 공유 할 수 있습니까? 코드가하는 일에 대해 정확히 알지 못하면서도 도움이 될 것입니다. – Aaron

+0

openDatabase 메서드는 DB를 여는 데 사용됩니다. 여기 있습니다 : NSArray * paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); NSString * documentsDirectory = [경로 objectAtIndex : 0]; NSString * writableDBPath = [documentsDirectory stringByAppendingPathComponent : @ "4PartyLocalSystem.sqlite"]; FMDatabase * database = [FMDatabase databaseWithPath : writableDBPath]; [데이터베이스 열기]; [데이터베이스 setTraceExecution : 예]; return database; –

+1

코멘트에 코드를 추가하는 대신 편집하여 질문에 코드를 추가하십시오. 댓글에서 코드를 읽는 것은 사실상 불가능합니다. –

답변

1

두 관찰 (,,,,, @,,,????????) : 당신은 전자가있는 경우

  1. 당신은 데이터베이스의 lastErrorMessage을 조사해야 rror. 데이터베이스를 닫기 전에 데이터베이스 호출을 여러 번 수행하려는 경우 데이터베이스 포인터를 별도의 변수에 저장하면 도움이됩니다.

    데이터베이스와의 한 세션에 대해 [TRSharedLocalDatabase openDatabase] 번을 여러 번 호출하고 싶지는 않습니다. 또는 싱글 톤 패턴을 따르도록 리펙토링 할 수 있습니다.

  2. 이상적 있습니다 (executeUpdateWithFormat documentation의 경고 참조) executeUpdateWithFormatexecuteUpdate 방법,하지의 printf 스타일의 자리와 SQL에 ? 자리를 사용해야합니다. 그렇지 않으면 이스케이프해야 할 문자 (예 : 따옴표)가있는 텍스트 입력란은 표시되지 않습니다. (. 이것은 또한 SQL 주입 공격으로부터 사용자를 보호합니다) 따라서

: 당신은`TRSharedLocalDatabase`에 대한 자세한 정보를 제공하는 경우

FMDatabase *database = [TRSharedLocalDatabase openDatabase]; 
if (!database) { 
    NSLog(@"Unable to open database"); 
    return; 
} 

if([database executeUpdate:@"INSERT INTO event (title,date,address,latitude,longitude,location,facebookID,picPath,description) VALUES (?,?,?,?,?,?,?,?,?)",event.title ,event.date, event.address, [NSNumber numberWithDouble:event.geoPoint.longitude], [NSNumber numberWithDouble:event.geoPoint.latitude], event.location.objectId, event.facebookID ,picPath ,event.description]) {  
    NSLog(@"Ok"); 
} else { 
    NSLog(@"Not Ok: %@", [database lastErrorMessage]); 
} 

[database close]; 
+0

고맙습니다 !!! 변수에 FMDatabase를 저장하고 DB가 lastErrorMessage를 기록 할 수 있습니다 !! 이제 쿼리를 수정했습니다 !! –

관련 문제