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

标签 c++ xcode sqlite

我很难在网上找到一个关于使用 xcode 和 cocos2dx 从 SQlite 数据库获取多个值的工作示例。这是我的 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 和 step 方法。

不过我找不到这两种方法的示例,请帮忙!

最佳答案

当使用 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, "SELECT a, b, c FROM SQList /* WHERE ... */",
                                -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 ...    
}

关于c++ - SQlite 查询 - 如何检索多列数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13538480/

相关文章:

c++ - 获取指向 boost::any::operator= 的指针

c++ - 指针作为模板参数?

具有大量滚动功能的 iOS UI 自动化

ios - 应用程序崩溃后收到来电 twilio

Android SQLite 不同的选择?

c++ - Opencv C++ : Display pixel value using cursor of the image before applying colormap

c++ - 从捕获 constexpr 函数返回值的变量中删除 constexpr 会删除编译时评估

xcode - 无法在 xcode 中隐藏导航栏

字段为空时的 Android 房间顺序

android - 在 Android SQLite 数据库中存储值的最快方法?