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 문 실행을 시도하고 값을 반환 할 수있었습니다.
내 코드의 문제점을 알고있을 수 있습니까?
코드에 중요한 문제가 없다고 생각합니다. 아래 필드의 철자를 데이터베이스로 확인하십시오. 보이스 원, 음성 사서함, 음성 사서함, 보이스 케어 – objectivecdeveloper