我正在使用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变量打印到控制台之外没有任何操作。这是我的下一个挑战。
感谢您的时间!
答案 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(真)。