c – SQlite查询 – 如何检索多列数据?

前端之家收集整理的这篇文章主要介绍了c – SQlite查询 – 如何检索多列数据?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我很难在网上找到一个关于使用 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 ...    
}

猜你在找的Xcode相关文章