我试图通过这种方式从数据库结果中获取整数或bool:
bool tblexist = false;
int t_exists = 0;
tblexist = (bool)sqlite3_column_text(chkStmt, 1);
t_exists = atoi(sqlite3_column_text(chkStmt, 1));
......但没有人工作。
sqlite3_column_text(chkStmt,1)的预期值始终为0或1。
但我收到错误消息:
从'const unsigned char *'到'const char *'的无效转换 初始化'int atoi(const char *)'的参数1 || ===构建完成:2个错误,0个警告=== |
如何解决这个问题并以优雅的方式获得整数或bool?
答案 0 :(得分:2)
尝试转换为bool
的第一行将始终返回true
,因为如果字符串指针不为NULL,则它将始终为“true”。如果你想使用它,有几种方法可以解决这个问题:
// 1. Dereference pointer to get first character in string
tblexist = (*sqlite3_column_text(chkStmt, 1) != '0');
// 2. Using string comparison
tblexist = (strcmp(sqlite3_column_text(chkStmt, 1), "0") != 0);
对于第二个,请尝试这样做:
t_exists = atoi((const char *) sqlite3_column_text(chkStmt, 1));
这是因为sqlite3_column_text
返回了const unsigned char *
类型,但atoi
想要const char *
。
答案 1 :(得分:0)
atoi或类似的转换使用起来会很昂贵。
const unsigned char _TRUE = '1';
const unsigned char* dbDATA = sqlite3_column_text(chkStmt, 1);
bool exists = (_TRUE == dbDATA[0]); //i assume you are expecting "0" or "1" from DB
答案 2 :(得分:0)
首先,列的索引从零开始,因此除非查询请求两个(或更多)列,sqlite3_column_text(..., 1)
将返回第二列。
其次,该函数返回一个指向字符串的指针,因此您必须从指针取消引用该值,并将该字符串转换为:
const char *data = sqlite3_column_text(chkStmt, 0);
int val = atoi (data); // for ascii representation of a number