在C++项目中使用SQLite3可实现轻量级本地数据存储,适用于桌面应用与嵌入式系统。1. 通过包管理器或官网下载安装SQLite3开发文件,包含sqlite3.h并链接库文件完成编译配置。2. 使用sqlite3_open()打开数据库连接,若文件不存在则自动创建,操作完成后调用sqlite3_close()关闭连接。3. 利用sqlite3_exec()执行SQL语句建表、插入数据,支持标准DDL与DML操作,如CREATE TABLE和INSERT,并通过返回码判断执行是否成功。

在C++项目中使用SQLite3进行本地数据存储是一种轻量、高效且无需独立数据库服务器的解决方案,特别适合桌面应用、嵌入式系统或需要离线存储的场景。SQLite3是一个C语言库,因此可以直接被C++调用,使用简单,集成方便。
1. 准备工作:安装与配置SQLite3
大多数Linux发行版自带SQLite3开发库,可通过包管理器安装:
# Ubuntu/Debiansudo apt-get install libsqlite3-devCentOS/RHEL
sudo yum install sqlite-devel
Windows用户可从SQLite官网下载预编译的DLL和头文件,或使用vcpkg、MinGW等工具链集成。
立即学习“C++免费学习笔记(深入)”;
在项目中包含以下两个关键文件:
sqlite3.h:头文件,声明API接口sqlite3.c 或链接 libsqlite3.a / sqlite3.lib
编译时需链接SQLite3库:
2. 打开与关闭数据库连接
使用 sqlite3_open() 打开一个数据库文件,若文件不存在则自动创建:
#include "sqlite3.h"#includesqlite3* db;int rc = sqlite3_open("example.db", &db);
if (rc) {std::cerr << "无法打开数据库: " << sqlite3_errmsg(db) << std::endl;return 1;}std::cout << "数据库打开成功" << std::endl;
// 使用完毕后关闭sqlite3_close(db);
3. 执行SQL语句:建表与增删改查
使用 sqlite3_exec() 可直接执行DDL和DML语句:
const char* sql = R"(CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER);)";rc = sqlite3_exec(db, sql, nullptr, nullptr, nullptr);if (rc != SQLITE_OK) {std::cerr << "建表失败: " << sqlite3_errmsg(db) << std::endl;}
插入数据示例:
sql = "INSERT INTO users (name, age) VALUES ('Alice', 25);";rc = sqlite3_exec(db, sql, nullptr, nullptr, nullptr);if (rc != SQLITE_OK) { std::cerr << "插入失败: " << sqlite3_errmsg(db) << std::endl;}
4. 查询数据:使用回调函数处理结果
通过回调函数接收查询结果:
static int callback(void* data, int argc, char** argv, char** azColName) { for (int i = 0; i < argc; ++i) { std::cout << azColName[i] << " = " << (argv[i] ? argv[i] : "NULL") << std::endl; } std::cout << "--------n"; return 0;}sql = "SELECT * FROM users;";rc = sqlite3_exec(db, sql, callback, nullptr, nullptr);if (rc != SQLITE_OK) {std::cerr << "查询失败: " << sqlite3_errmsg(db) << std::endl;}
5. 使用预编译语句(推荐用于参数化操作)
对于频繁执行或带用户输入的SQL,应使用预编译语句防止SQL注入并提升性能:
sqlite3_stmt* stmt;const char* insert_sql = "INSERT INTO users (name, age) VALUES (?, ?);";rc = sqlite3_prepare_v2(db, insert_sql, -1, &stmt, nullptr);if (rc == SQLITE_OK) {sqlite3_bind_text(stmt, 1, "Bob", -1, SQLITE_STATIC);sqlite3_bind_int(stmt, 2, 30);
if (sqlite3_step(stmt) != SQLITE_DONE) { std::cerr << "执行失败: " << sqlite3_errmsg(db) << std::endl;}
}sqlite3_finalize(stmt);
查询也可使用预编译方式逐行读取:
const char* select_sql = "SELECT id, name, age FROM users WHERE age > ?;";rc = sqlite3_prepare_v2(db, select_sql, -1, &stmt, nullptr);if (rc == SQLITE_OK) {sqlite3_bind_int(stmt, 1, 20);while (sqlite3_step(stmt) == SQLITE_ROW) {int id = sqlite3_column_int(stmt, 0);const unsigned char* name = sqlite3_column_text(stmt, 1);int age = sqlite3_column_int(stmt, 2);std::cout << "ID: " << id << ", 名字: " << name << ", 年龄: " << age << std::endl;}}sqlite3_finalize(stmt);
基本上就这些。C++结合SQLite3实现本地数据存储非常实用,尤其在没有复杂并发需求的场景下。掌握打开数据库、执行语句、使用回调和预编译语句这四个核心环节,就能完成绝大多数嵌入式数据库编程任务。不复杂但容易忽略的是错误检查和资源释放,务必每次调用后判断返回值,并及时调用 finalize 和 close。
以上就是c++++如何使用SQLite3进行本地数据存储_c++嵌入式数据库编程的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1487996.html
微信扫一扫
支付宝扫一扫