2011-11-10 15 views
0

iPad 응용 프로그램을 개발 중입니다.
리소스 폴더에 SQLite 데이터베이스가 있습니다.
내 응용 프로그램이 시작되면이 코드는 데이터베이스를 NSDocumentDirectory에 복사합니다.SQLite 데이터베이스에서 값을 검색 할 수 없습니다.

- (void) copyDatabaseIfNeeded { 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    NSString *dbPath = [self getDBPath]; 
    BOOL success = [fileManager fileExistsAtPath:dbPath]; 

    if(!success) { 

    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Mydata.sqlite"]; 
    success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error]; 

    if (!success) 
     NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]); 
    } 
} 

- (NSString *) getDBPath { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
    NSString *documentsDir = [paths objectAtIndex:0]; 
    return [documentsDir stringByAppendingPathComponent:@"Mydata.sqlite"]; 
} 

내 응용 프로그램의 다른보기에서 데이터베이스를 열고 일부 값을 검색하려면 이러한 코드가 있습니다.

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDir = [paths objectAtIndex:0]; 
if(sqlite3_open([[documentsDir stringByAppendingPathComponent:@"Mydata.sqlite"] UTF8String], &db) != SQLITE_OK){ 
    sqlite3_close(db); 
    NSAssert(0, @"Failed to open database."); 
} 
NSString *sql = [[NSString alloc] initWithFormat:@"SELECT HOMEONE, HOMETWO, HOMETHREE, HOMEFOUR FROM STUDENTS WHERE NAME='%@'",Name]; 
sqlite3_stmt *statement; 
if(sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil)== SQLITE_OK) 
{ 
    while(sqlite3_step(statement) == SQLITE_ROW){ 
     char *one = (char *) sqlite3_column_text(statement,0); 
     ActionOne = [[NSString alloc] initWithUTF8String:one]; 
     char *two = (char *) sqlite3_column_text(statement,1); 
     ActionTwo = [[NSString alloc] initWithUTF8String:two]; 
     char *three = (char *) sqlite3_column_text(statement,2); 
     ActionThree = [[NSString alloc] initWithUTF8String:three]; 
     char *four = (char *) sqlite3_column_text(statement,3); 
     ActionFour = [[NSString alloc] initWithUTF8String:four]; 
    } 
    sqlite3_finalize(statement); 
} 

예, 이러한 코드를 사용하여 데이터베이스에서 값을 검색 할 수 있습니다.
하지만 이제 코드를 편집 할 때 더 많은 값을 검색해야합니다.

NSString *sql = [[NSString alloc] initWithFormat:@"SELECT HOMEONE, HOMETWO, HOMETHREE, HOMEFOUR, VOICEONE, VOICETWO, VOICETHREE, VOICEFOUR FROM STUDENTS WHERE NAME='%@'",Name]; 
sqlite3_stmt *statement; 
if(sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil)== SQLITE_OK) 
{ 
    while(sqlite3_step(statement) == SQLITE_ROW){ 
     char *one = (char *) sqlite3_column_text(statement,0); 
     ActionOne = [[NSString alloc] initWithUTF8String:one]; 
     char *two = (char *) sqlite3_column_text(statement,1); 
     ActionTwo = [[NSString alloc] initWithUTF8String:two]; 
     char *three = (char *) sqlite3_column_text(statement,2); 
     ActionThree = [[NSString alloc] initWithUTF8String:three]; 
     char *four = (char *) sqlite3_column_text(statement,3); 
     ActionFour = [[NSString alloc] initWithUTF8String:four]; 

     char *vone = (char *) sqlite3_column_text(statement,4); 
     VoiceOne = [[NSString alloc] initWithUTF8String:vone]; 
     char *vtwo = (char *) sqlite3_column_text(statement,5); 
     VoiceTwo = [[NSString alloc] initWithUTF8String:vtwo]; 
     char *vthree = (char *) sqlite3_column_text(statement,6); 
     VoiceThree = [[NSString alloc] initWithUTF8String:vthree]; 
     char *vfour = (char *) sqlite3_column_text(statement,7); 
     VoiceFour = [[NSString alloc] initWithUTF8String:vfour]; 
    } 
    sqlite3_finalize(statement); 
} 

이제는 HOMEONE, HOMETWO, HOMETHREE, HOMEFOUR 값도 검색하지 않습니다. VOICEONE, VOICETWO, VOICETHREE, VOICEFOUR 값만 가져 오기 위해 SQL 문을 변경해 보았습니다. 또한 모든 값을 제공하지 않습니다.

나는 몇 가지 검사를하고 응용 프로그램도이 라인에 단계하지 않았다 발견 :

if(sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil)== SQLITE_OK) 

성공하지 않은 sqlite3_prepare_v2을 의미? 데이터베이스 필드 유형을 점검했습니다.
'SQLite Database Browser'에서 SQL 문 실행을 시도하고 값을 반환 할 수있었습니다.

내 코드의 문제점을 알고있을 수 있습니까?

+0

코드에 중요한 문제가 없다고 생각합니다. 아래 필드의 철자를 데이터베이스로 확인하십시오. 보이스 원, 음성 사서함, 음성 사서함, 보이스 케어 – objectivecdeveloper

답변

1

이 문제는 데이터베이스를 변경하고 새 복사본을 복사 할 수 있으며 시뮬레이터 나 장치에서 응용 프로그램을 제거하고 프로젝트를 실행하는 것을 잊어 버렸기 때문에 발생할 수 있습니다. 만약 당신이 시뮬레이터에서 다음 plz 데이터베이스 경로를 복사 하고이 경로에서 SQLite 데이터베이스 브라우저에서 열어 SQL 문을 실행하려고 여기에 실행하고 그것도 여기에 실행되지 않는 것을 발견 할 것이 좋습니다. 새 데이터베이스를 프로젝트에 복사하는 경우 시뮬레이터 나 장치에서 앱을 삭제하십시오.

+0

고맙습니다! 이게 내 문제를 해결했습니다! – Lloydworth

관련 문제