我很难在网上找到一个关于使用
xcode和cocos2dx从sqlite DB获取多个值的工作示例.这是我的SQL查询:
char sql_query[100]; sprintf(sql_query,"SELECT * FROM sqlist WHERE ColumnD BETWEEN %d AND %d ORDER BY RANDOM() LIMIT 1",MinColumnD,MaxColumnD);
它自己的查询似乎工作,主要问题是如何将我从’select *’收集的值转换为另一个int或char参数,以便我可以使用它?
我发现的一些例子提到了使用回调结构或提到使用sqlite3_prepare_v2和步骤方法.
我无法找到任何一种方法的例子,请帮忙!
解决方法
使用sqlite3_exec时,必须转换字符串中的所有值,并且必须使用回调的void *指针或某些全局变量来返回数据:
struct MyData { string A; int B,C; }; int exec_callback(void *ptr,int argc,char *argv[],char *names[]) { vector<MyData> *list = reinterpret_cast<vector<MyData> *>(ptr); MyData d; d.A = argv[0] ? argv[0] : ""; d.B = atoi(argv[1]); d.C = atoi(argv[2]); list->push_back(d); return 0; } void query_with_exec() { vector<MyData> list; char *errmsg = NULL; sqlite3_exec(db,"SELECT a,b,c FROM sqlist /* WHERE ... */",exec_callback,&list,&errmsg); if (errmsg) { printf("error: %s!\n",errmsg); return; } // use list ... }
当使用sqlite3_prepare *时,你必须在循环中调用sqlite3_step,直到它不再返回sqlITE_ROW(当你只想要一条记录时,你只能调用一次):
void query_with_step() { vector<MyData> list; sqlite3_stmt *stmt; int rc = sqlite3_prepare_v2(db,-1,&stmt,NULL); if (rc != sqlITE_OK) { printf("error: %s!\n",sqlite3_errmsg(db)); return; } for (;;) { rc = sqlite3_step(stmt); if (rc == sqlITE_DONE) break; if (rc != sqlITE_ROW) { printf("error: %s!\n",sqlite3_errmsg(db)); break; } MyData d; const char *text = (const char *)sqlite3_column_text(stmt,0); d.A = text ? text : ""; d.B = sqlite3_column_int(stmt,1); d.C = sqlite3_column_int(stmt,2); list.push_back(d); } sqlite3_finalize(stmt); // use list ... }