Невозможно получить значения из базы данных SQLite - PullRequest
0 голосов
/ 10 ноября 2011

Я занимаюсь разработкой приложения для iPad.
В моей папке ресурсов есть база данных SQLite.
Когда мое приложение запускается, эти коды копируют базу данных в мой NSDocumentDirectory.

- (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. Я попытался изменить свой оператор SQL, чтобы получить только значения VOICEONE, VOICETWO, VOICETHREE, VOICEFOUR, он также не дает никаких значений.

Я провел некоторую проверку и обнаружил, что приложение даже не зашло в эту строку:

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

Что означает, что sqlite3_prepare_v2 не успешен? Я проверил типы полей базы данных.
Я попытался выполнить оператор SQL в «Браузере баз данных SQLite», и он смог вернуть значения.

Могу ли я узнать, в чем проблема с моими кодами?

1 Ответ

1 голос
/ 10 ноября 2011

Эта проблема может возникать из-за того, что вы изменили свою базу данных и скопировали новую, забыли удалить приложение из симулятора или устройства и пытаться запустить проект.Что я предлагаю, если вы запускаете его в симуляторе, то плз скопируйте путь к базе данных и откройте его в браузере баз данных SQLite по этому пути и попробуйте запустить здесь оператор SQL, и вы обнаружите, что он не работает и здесь.Пожалуйста, удалите приложение из симулятора или устройства, если вы копируете новую базу данных в проект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...