新闻中心

c++如何使用SQLite3进行本地数据存储_c++嵌入式数据库编程

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

c++如何使用sqlite3进行本地数据存储_c++嵌入式数据库编程

在C++项目中使用SQLite3进行本地数据存储是一种轻量、高效且无需独立数据库服务器的解决方案,特别适合桌面应用、嵌入式系统或需要离线存储的场景。SQLite3是一个C语言库,因此可以直接被C++调用,使用简单,集成方便。

1. 准备工作:安装与配置SQLite3

大多数Linux发行版自带SQLite3开发库,可通过包管理器安装:

# Ubuntu/Debian
sudo apt-get install libsqlite3-dev
<h1>CentOS/RHEL</h1><p>sudo yum install sqlite-devel</p>

Windows用户可从SQLite官网下载预编译的DLL和头文件,或使用vcpkg、MinGW等工具链集成。

在项目中包含以下两个关键文件:

  • sqlite3.h:头文件,声明API接口
  • sqlite3.c 或链接 libsqlite3.a / sqlite3.lib

编译时需链接SQLite3库:

g++ main.cpp -lsqlite3 -o app

2. 打开与关闭数据库连接

使用 sqlite3_open() 打开一个数据库文件,若文件不存在则自动创建:

PHP的使用技巧集 PHP的使用技巧集

PHP 独特的语法混合了 C、J*a、Perl 以及 PHP 自创新的语法。它可以比 CGI或者Perl更快速的执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成HTML标记的CGI要高许多。下面介绍了十个PHP高级应用技巧。 1, 使用 ip2long() 和 long2ip() 函数来把 IP 地址转化成整型存储到数据库里

PHP的使用技巧集 454 查看详情 PHP的使用技巧集

#include "sqlite3.h"
#include <iostream>
<p>sqlite3* db;
int rc = sqlite3_open("example.db", &db);</p><p>if (rc) {
std::cerr << "无法打开数据库: " << sqlite3_errmsg(db) << std::endl;
return 1;
}
std::cout << "数据库打开成功" << std::endl;</p><p>// 使用完毕后关闭
sqlite3_close(db);</p>

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
);)";
<p>rc = sqlite3_exec(db, sql, nullptr, nullptr, nullptr);
if (rc != SQLITE_OK) {
std::cerr << "建表失败: " << sqlite3_errmsg(db) << std::endl;
}</p>

插入数据示例:

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;
}
<p>sql = "SELECT * FROM users;";
rc = sqlite3_exec(db, sql, callback, nullptr, nullptr);
if (rc != SQLITE_OK) {
std::cerr << "查询失败: " << sqlite3_errmsg(db) << std::endl;
}</p>

5. 使用预编译语句(推荐用于参数化操作)

对于频繁执行或带用户输入的SQL,应使用预编译语句防止SQL注入并提升性能:

sqlite3_stmt* stmt;
const char* insert_sql = "INSERT INTO users (name, age) VALUES (?, ?);";
<p>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);</p><pre class='brush:php;toolbar:false;'>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);
<p>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);</p>

基本上就这些。C++结合SQLite3实现本地数据存储非常实用,尤其在没有复杂并发需求的场景下。掌握打开数据库、执行语句、使用回调和预编译语句这四个核心环节,就能完成绝大多数嵌入式数据库编程任务。不复杂但容易忽略的是错误检查和资源释放,务必每次调用后判断返回值,并及时调用 finalize 和 close。

以上就是c++++如何使用SQLite3进行本地数据存储_c++嵌入式数据库编程的详细内容,更多请关注其它相关文章!


# 如何使用  # 红桥区网站网络推广中心  # 家乡文化推广网站靠谱  # 潍坊绍兴网站建设  # seo搜索考核  # 在国外建个网站如何推广  # 泰州网站优化效果怎样  # 卡点营销推广  # 遵化seo关键词优化  # 线上怎么推广网站  # 广州营销类网站推广  # 有什么区别  # 第三方  # 管理器  # 不存在  # 微软  # linux  # 嵌入式系统  # 使用技巧  # 回调  # 数据存储  # stream  # win  # ios  # c++  # ai  # 工具  # ubuntu  # app  # c语言  # windows  # centos 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: win11 Snap Layouts怎么用 Win11窗口布局与分屏多任务高效指南【必学】  J*a里如何使用N*igableMap进行导航操作_可导航Map操作技巧解析  抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩  C++指针和引用有什么区别_C++内存管理核心概念深度解析  在J*a中如何使用Stream.map转换元素_Stream映射操作解析  解决J*aScript中重复选择项的确认对话框显示问题  jQuery Mask 插件中实现电话号码固定前导零的教程  126邮箱手机版登录官网2026_126手机邮箱免费入口最新  CSS Box Model与弹性按钮:维持布局稳定的动画实践  Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】  CSS响应式网页如何实现主次模块比例自适应_flex-grow与flex-shrink调整  批改网学生版PC登录 批改网官网登录系统入口  Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询  《燕云十六声》两周内达九百万玩家!位居畅销榜第五  邮政快递包裹最新位置 邮政快递实时追踪入口  打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门  React列表渲染与独立状态管理:避免全局状态影响局部更新  在Qt QML中通过Python字典动态更新TextEdit内容的教程  Mac终端命令大全_Mac常用Terminal指令速查  Win11怎么开启高性能模式_Windows 11电源计划优化设置  qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程  浏览器打开即用 美图秀秀网页版入口  韩剧圈正版入口页面_韩剧圈官网登录链接  QQ邮箱登录官网首页 腾讯QQ邮箱网页入口  一加 14R 快充无反应_一加 14R 充电优化  妖精动漫免费平台 妖精动漫官网资源观看网址  html怎么运行外部js文件中的函数_运html外js文件函数法【技巧】  不同用户不同价格! 索尼开启账户个性化定价测试  fishbowl官网免费版 fishbowl养鱼网站入口  Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖  126邮箱网页版官方入口 126邮箱账号在线登录平台  钉钉视频会议声音异常如何处理 钉钉会议音频修复技巧  ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版  SteamMachine定价或为699美元 大家想入手吗?  在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明  CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略  曝R星经典之作开发图 设计简陋但信息密集!  夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案  服务端验证_j*ascript输入检查  Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐  三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升  2026春节假期票务安排_2026春节放假购票指南  J*aScript打印功能_j*ascript输出控制  地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站  Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】  Excel文件在线转换快速入口 Excel在线格式转换网站  Win11怎么设置鼠标指针速度_Win11提高鼠标指针精确度选项  虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作  网站内容防复制粘贴的实现策略与局限性  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图 

搜索