Проблема получения BOOL из БД SQLite - PullRequest
2 голосов
/ 29 мая 2011

Я пишу приложение, использующее базу данных SQLite для хранения информации.Моя таблица базы данных включает 5 полей: gameID (первичный ключ, int), gameName (Varchar), isLocked, isHidden и isFavorite (все bools).Я настроил базу данных с помощью SQLite Manager в FireFox.

+ (void) getInitialDataToDisplay:(NSString *)dbPath {

FightingGamesGuideAppDelegate *appDelegate = (FightingGamesGuideAppDelegate *)[[UIApplication sharedApplication] delegate];

if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {


        //My second thought is that this line is incorrect.  (see below)
    const char *sql = "select gameID, gameName, isLocked, isHidden, isFavorite from GameTable";
    sqlite3_stmt *selectstmt;
    if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) {

        while(sqlite3_step(selectstmt) == SQLITE_ROW) {


            NSInteger primaryKey = sqlite3_column_int(selectstmt, 0);
            Games *coffeeObj = [[Games alloc] initWithPrimaryKey:primaryKey];
            //getGameName
            coffeeObj.gameName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)];

            //I think these three lines are where the problem is
            coffeeObj.isLocked=(BOOL)sqlite3_column_int(selectstmt, 2);
            coffeeObj.isHidden=(BOOL)sqlite3_column_int(selectstmt, 3);
            coffeeObj.isFavorite=(BOOL)sqlite3_column_int(selectstmt, 4);

              //This line is only to check if the data loaded properly
            NSLog(@"%i, %i, %i",isLocked, isHidden, isFavorite);


            [appDelegate.coffeeArray addObject:coffeeObj];

            [coffeeObj release];
        }
    }
}
else{
    sqlite3_close(database); //Even though the open call failed, close the database connection to release all the memory.
}

}

Мой вопрос: это как получить bool из базы данных SQLite?Есть ли лучший способ, такой как использование int вместо bool?Если у меня все в порядке с кодом, есть ли у вас какие-либо другие предложения о том, как я могу это сделать?

Я знаю, что код, кроме этих трех строк (и следующей строки), работает правильно.В БД я случайным образом назначил три значения типа «ДА» или «НЕТ».Я также пробовал 1 и 0, безрезультатно.

Если строки правильные, я думаю, что строка 9 неверна.Я изменил его с "const ... =" select gameID, gameName from GameTable ", а gameID и gameName по-прежнему работают должным образом.

Третья мысль: я не обновляю db правильно. Я выиграл 'не вдаваться в это, кроме того, чтобы спросить, есть ли конкретная кнопка «сохранить» / элемент списка. Если я обновлю gameName, которое будет отображаться в моем приложении, я предлагаю сохранить db автоматически.

При просмотре других вопросовЯ только нашел предположения, что CoreData - лучшая идея. Однако, если я на правильном пути, мне нужны только эти три строки, и я закончил (с этой частью).

Кроме того, я знаю, что с переменными bool ничего не делается, кроме как выводить их на консоль. Это мой следующий вызов.

Спасибо за потраченное время!

Ответы [ 2 ]

2 голосов
/ 29 мая 2011

В дополнение к ответу p.campbell (+1), вы можете вспомнить ваше значение BOOL, например, если вы храните YES / NO в вашей БД:

  coffeeObj.isLocked=[[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)] isEqualToString:@"YES"];
  coffeeObj.isHidden=[[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 3)] isEqualToString:@"YES"];
  coffeeObj.isFavorite=[[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 4)] isEqualToString:@"YES"];
1 голос
/ 29 мая 2011

На странице Типы данных SQLite есть ответ, который вы ищете:

SQLite не имеет отдельного класса логического хранилища. Вместо этого логические значения хранятся в виде целых чисел 0 (ложь) и 1 (истина).

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