首页 > 解决方案 > 需要帮助将我从 sqlite3 DB 获得的值存储在 C++ 变量中

问题描述

我有一个“Data.db”,里面有 3 个存储某种“足球数据”的表。一张桌子供“团队”使用,另一张桌子供“玩家”使用。我现在要做的是从“团队”中获取“最高”ID,以便将新生成的玩家分配给该团队。(每个玩家都有一个_teamId)

我可以使用这个查询和一个只打印我需要的值的 callback_id 来打印我想要的 ID。

询问:

string query = "SELECT COUNT(ID) FROM TEAMS;";

highest_id = (sqlite3_exec(db, query.c_str(), callback_id, 0, &messageError));

打回来:

int Team::callback_id(void* data, int count, char** values, char** columns) {
    int id = atoi(values[1]);

    std::cout << "callback_id says: " << id << endl;

    return 0;
}

我必须做些什么才能将回调函数中的这个 id 存储在一个变量中,以便稍后在我的程序中使用?似乎我不能只返回它,也不能只将 id 值分配给我Team::_id,因为它给了我一个错误: 'invalid use of member ‘Team::_id’ in static member function'

帮助将不胜感激。我仍在尝试了解有关 sqlite3 和回调函数的更多信息,但我已经在这个问题上浪费了太多时间,以至于我不知道我还能尝试什么。

标签: c++sqlite

解决方案


您有一个当前设置为的void*参数。相反,将指针传递给那里的对象。这使得可以在回调中的该对象中存储您喜欢的内容。sqlite3_exec0

经常传递一个指向对象的指针并调用该对象中的非static成员函数来处理回调。

例子:

class Team {
public:
    void func() {
        std::string query = "SELECT COUNT(ID) FROM TEAMS;";
        sqlite3_exec(db, query.c_str(), &Team::callback_id_proxy, this, &messageError);
        //                                                        ^^^^
    }

    // a static callback proxy, casting `data` to a `Team*`
    static int callback_id_proxy(void* data, int count, char** values, char** columns) {
        return static_cast<Team*>(data)->callback_id(count, values, columns);
    }

    int callback_id(int count, char** values, char** columns) {
        // here you can store what you like in your `Team` object
        if(count > 0) highest_id = atoi(values[0]);
        else highest_id = 0;
        return 0;
    }

    int highest_id;
};

注意:您可能想SELECT MAX(ID) FROM TEAMS;改用。否则,如果您删除一个团队然后添加一个新团队,您可能会得到重复。

另一种选择是制作func和制作highest_id static。我已经重命名highest_idnumber_of_teams这里,因为它真的是这样。

class Team {
public:
    static int get_number_of_teams() {
        std::string query = "SELECT COUNT(ID) FROM TEAMS;";
        if(sqlite3_exec(db, query.c_str(),
                        &Team::callback_count,
                        nullptr,    // static function, no "this" available
                        &messageError) == SQLITE_ABORT)
            throw std::runtime_error("callback_id returned non-zero");

        return number_of_teams;
    }

    static int callback_count(void* data, int count, char** values, char** columns) {
        if(count > 0) {
            number_of_teams = atoi(values[0]);
            return 0;
        }
        return 1; // indicate error
    }

private:
    inline static int number_of_teams = -1;
};

推荐阅读