2012-11-20 7 views
-1

많은 방법으로 데이터를 sqlite 데이터베이스에 삽입하려고 구현했습니다. 런타임에 실행 된 코드는 삽입 된 ID를 반환하지만 데이터베이스를 확인할 때 아무 것도 삽입되지 않습니다. 누구가 문제인지 아는 사람 있습니까? 미리 감사드립니다.런타임에 삽입 문을 실행했지만 데이터가 iPhone의 데이터베이스에 삽입되지 않았습니다.

sqlite3 *database; 
sqlite3_stmt *addStmt; 
NSFileManager *fileMgr = [NSFileManager defaultManager]; 
NSString *dbPath = [[[NSBundle mainBundle] resourcePath]stringByAppendingPathComponent:@"MoviePlayerMgmt.rdb"]; 
BOOL success =[fileMgr fileExistsAtPath:dbPath]; 
if(!success) 
{ 
    NSLog(@"Cannot locate file %@",dbPath); 

} 
else{ 
    NSLog(@"__________Open the file__________ %@",dbPath); 

    if(!(sqlite3_open([dbPath UTF8String], &database)==SQLITE_OK)) 
    { 
     NSLog(@"An error has occured: %@",[NSString stringWithUTF8String:(char *) sqlite3_errmsg(database)]); 
    } 
    else{ 
     NSLog(@"Open database"); 
     NSString *strName = txtName.text; 
           NSLog(@"Computer name is %@",strName); 
          NSString *strIP = txtIP.text; 
          NSString *strPort = txtPort.text; 
     NSString *insertStatement = [NSString stringWithFormat:@"INSERT INTO COMPUTER (computerName, IPAddress, portNumber) VALUES (\"%@\", \"%@\", \"%@\")", strName, strIP, strPort]; 

     char *error; 
     if (sqlite3_exec(database, [insertStatement UTF8String], NULL, NULL, &error) == SQLITE_OK) 
     { 
      int computerID = sqlite3_last_insert_rowid(database); 


       NSLog(@"A computer inserted. %d",computerID); 
       sqlite3_close(database); 
     } 
     else 
     { 
      NSLog(@"Error: %s", error); 
     } 

    } 
} 
+0

삽입 후 프로그램 적으로 모든 레코드를 검색하려고 했습니까? 레코드가 삽입 되었습니까? –

+0

코드를 디버그하여 데이터가 삽입되지 않은 경우 생성 된 오류를 자세히 알려주십시오. – AJPatel

+0

computerID 값을 확인했는데 값을 반환했습니다. –

답변

5

앱의 리소스 번들은 읽기 전용입니다 (적어도 실제 iOS 장비에) : 코드는 여기 구현했습니다. 앱의 리소스 번들에있는 데이터베이스에는 쓸 수 없습니다.

앱을 처음 실행할 때 앱의 번들에서 앱의 샌드 박스에있는 쓰기 가능한 다른 디렉토리로 초기 데이터베이스를 복사해야합니다. 그런 다음이 사본을 항상 읽고 쓰기 위해 사용합니다.

편집 :

또한 sqlite3_open_v2sqlite3_open의 사용을 변경해야합니다. 이렇게하면 좀 더 제어 할 수 있습니다.

또한 삽입 문과 같은 쿼리를 문자열 형식을 사용하여 만들지 마십시오. ?를 사용하여 쿼리를 만들어야합니다. 각 변수에 대한 기호. 그런 다음 적절한 sqlite3_bind_xxx 함수를 사용하여 적절한 값을 문에 바인딩하십시오. 이렇게하면 값이 올바르게 이스케이프됩니다.

+0

데이터베이스를 앱의 샌드 박스에 복사하는 방법을 알려주시겠습니까 –

+0

sqlite3_v2 및 sqlite3_bind_text로 변경했지만 문제가 해결되지 않았습니다. app의 sandbox에 데이터베이스를 복사하고 시뮬레이터 (ios 6 시뮬레이터)에서 확인하는 방법을 모르겠습니다. –

+1

@DieuLinh 파일 복사에 대한 기존 토론이 많이 있습니다. 한 가지 예가 [다른 질문에 대한 내 대답] (http://stackoverflow.com/questions/13462243/ios-bundle-app-with-text-file/13464354#13464354)입니다. – rmaddy

관련 문제