在interweb上有一百万个例子,详细说明使用sqlite3_exec
从表中选择行并使用此回调函数打印它们:
static int callback(void *NotUsed, int argc, char **argv, char **azColName){
int i;
for(i=0; i<argc; i++){
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
这是实现callback
的代码:
[...]
rc = sqlite3_exec(db, sql, callback, &nrecs, &zErrMsg);
[...]
现在,我认为将获取的数据用于除打印之外的其他内容将是一个相当标准的场景,但对于我的生活,我无法找到应该如何完成。
我想要做的是获取一行(argc
将为1),其中包含两列,并且可以从argv[0]
访问这两个值(argv[1]
和sqlite3_exec
)被执行了。
我想这与void *NotUsed
有关。 (世界上这是一个指针,为什么所有的例子都坚持不使用它?)
如果有人可以帮助我,我会非常感激。如果你还能向我解释为什么这个看似微不足道的任务变得如此复杂,你将拥有我永恒的爱。 (获取的数据在从另一个函数调用的静态函数中处理。这有效地杀死了使用面向对象语言的目的,对吗?)
答案 0 :(得分:6)
&#39;键&#39;是sqlite3_exec的第四个参数。
通常情况如下: 你有这个结构你想用sqlite查询填写:
struct xyz_t
{
int a ;
int b ;
} ;
然后你像这样调用sqlite3_exec:
//fill in query text
xyz_t xyz; // struct you want to fill
sqlite3_exec(db, sql, callback, &xyz, &zErrMsg);
回调就是这样做的:
static int callback(void *veryUsed, int argc, char **argv, char **azColName){
int i;
xyz_t *xyz = (xyz_t *)veryUsed ;
for(i=0; i<argc; i++){
if (strcmp(azColName[i], "a") == 0)
xyz->a = atoi(argv[1]) ;
else if ...
}
return 0;
}
你可以在每次调用时传递一个std :: vector和push_back一个新的xyz_t。不适合C ++程序员,但这是一个混合的C / C ++世界...