c++ - 需要帮助将我从 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 和回调函数的更多信息,但我已经在这个问题上浪费了太多时间,以至于我不知道我还能尝试什么。
解决方案
您有一个当前设置为的void*
参数。相反,将指针传递给那里的对象。这使得可以在回调中的该对象中存储您喜欢的内容。sqlite3_exec
0
经常传递一个指向对象的指针并调用该对象中的非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_id
为number_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;
};
推荐阅读
- python - 删除不是 a 到 z 的所有内容
- python - 在行首添加带有特定字符串的字符 - Python
- angular - 无法在注销后的 url 上重定向 azure AD
- nlog - NLog 截断语法
- javascript - 如何检索 Firebase-Instance-ID-token?
- javascript - 单击添加类以使用 vanilla JavaScript 隐藏其他元素
- javascript - 未捕获的 ReferenceError:未定义 getVote?
- java - 使用预签名 URL 限制 S3 PUT 文件大小
- node.js - Angular 10 + NodeJS + Express - 无法加载图像但在本地工作
- swift - 如何在 Xcode 中查看到本地主机的 http 流量