从SQLite DB获取BOOL时出现问题

时间:2011-05-29 00:20:39

标签: iphone sqlite

我正在使用SQLite数据库编写应用程序来存储信息。我的db表包含5个字段:gameID(主键,int),gameName(Varchar),isLocked,isHidden和isFavorite(所有bools)。我在FireFox中使用SQLite Manager设置了数据库。

+ (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.
}

}

我的问题:这是如何从SQLite数据库中获取bool的吗?有没有更好的方法,比如使用int作为bool?如果我的代码都是正确的,您对我如何做到这一点有任何其他建议吗?

我知道除了这三行(以及以下行)之外的代码也能正常工作。在db中,我随机将三个bool分配给YES或NO。我也试过1和0,没有效果。

如果线条正确,我的第二个想法是第9行是错误的。我修改了它来自“const ... =”选择gameID,来自GameTable的gameName,并且gameID和gameName仍能正常工作。

我的第三个想法是我没有正确更新数据库。除了询问是否有特定的“保存”按钮/列表项之外,我不会再讨论这个问题。如果我更新了我的应用程序中显示的gameName,建议自动保存数据库。

在查看其他问题时,我只发现CoreData是一个更好主意的建议。但是,如果我走在正确的轨道上,我只需要这三条线就可以了,我已经完成了(有了这部分)。

除此之外 - 我知道除了将bool变量打印到控制台之外没有任何操作。这是我的下一个挑战。

感谢您的时间!

2 个答案:

答案 0 :(得分:2)

除了p.campbell的答案(+1)之外,如果你在数据库中存储YES / NO,你可以回想起这样的BOOL值:

  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 :(得分:1)

SQLite datatypes page有您正在寻找的答案:

  

SQLite没有单独的布尔存储类。相反,布尔值存储为整数0(假)和1(真)。