当前位置: 首页 > article >正文

SQLite数据库C++基础用法

1. 引言笔者最近在做嵌入式Linux应用项目中需要用到SQLite数据库因此本期分享一下其基础知识。SQLite 是一个嵌入式、无服务器的轻量级关系型数据库它以函数库形式直接集成到应用程序中将整个数据库存储为单个普通文件无需安装、配置或维护独立进程。因其极小的内存占用、零管理成本和跨平台特性非常适合移动应用、桌面软件、嵌入式设备或测试原型等单应用本地存储场景。相比 MySQL等传统数据库SQLite 牺牲了高并发写入、网络访问和复杂权限管理换来了极简部署和直接文件访问的高性能。因此当你的应用只需本地数据存储、没有多客户端同时写入时SQLite 是最省力的选择反之需要网络服务、高并发或企业级功能时才选用其他数据库。2. 基础SQL语法2.1 创建表基本语法如下CREATE TABLE database_name.table_name( column1 datatype PRIMARY KEY(one or more columns), column2 datatype, column3 datatype, ..... columnN datatype, );CREATE TABLE代表创建表的关键字。data type代表每一列的数据类型PRIMARY KEY代表的是主键表示唯一标识。实例如下所示以笔者项目为例/* 创建检测记录表的 SQL 语句 */ const char *create_table_sql CREATE TABLE IF NOT EXISTS inspection_records ( id INTEGER PRIMARY KEY AUTOINCREMENT, inspected_at TEXT NOT NULL, product_code TEXT NOT NULL, result_pass INTEGER NOT NULL, failure_reason TEXT NOT NULL, recipe_version TEXT NOT NULL );;上述例子中先创建了一个C风格的字符串指针create_table_sql指向后边的SQL语句文本表名为inspection_records。下边针对SQL语句一行一行的看第一列是id主键、INTEGER代表整数类型PRIMARY KEY AUTOINCREMENT表示这是主键并且每次插入时自动生成自增值。第二列是inspected_at类型是TEXTNOT NULL表示这一列必须要有值该列用于存放时间戳。第三列是product_code类型是TEXTNOT NULL表示这一列必须要有值该列用于存放产品码其他的也是同理就不再多加说明。2.2 插入基本语法有两种如下所示#第一种 column1, column2,...columnN 是要插入数据的表中的列的名称 INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)] VALUES (value1, value2, value3,...valueN); # 第二种要为表中的所有列添加值 #可以不需要在 SQLite 查询中指定列名称 #但要确保值的顺序与列在表中的顺序一致 INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);其中TABLE_NAME为表名VALUES、INSERT INTO为关键字。以笔者项目举例使用方法如下/*插入表代表占位符表示插入前由程序动态提供具体值 *有占位符时需使用绑定函数将值传入到预编译语句中否则会导致 SQL 注入风险 */ const char *insert_sql INSERT INTO inspection_records( inspected_at, product_code, result_pass, failure_reason, recipe_version ) VALUES(?, ?, ?, ?, ?);;2.3 查询在SQLie数据库中使用SELECT语句在数据库表中获取数据以结果表得形式返回数据。基本语法如下# column1, column2...是表的字段他们的值即是要获取的 SELECT column1, column2, columnN FROM table_name; # 如果想获取所有可用的字段那么可以使用下面的语法 SELECT * FROM table_name;实例如下所示/*构建查询SQL语句根据条件动态添加过滤和限制*/ std::string sql SELECT inspected_at, product_code, result_pass, failure_reason, recipe_version FROM inspection_records;2.4 WHERE子句SQLite的WHERE子句用于指定从一个表或多个表中获取数据的条件。如果满足给定的条件即为真true时则从表中返回特定的值。可以使用 WHERE 子句来过滤只获取需要的记录一般可用在 SELECT、 UPDATE、DELETE 语句中。其语法如下SELECT column1, column2, columnN FROM table_name WHERE [condition]2.5 Limit子句SQLite 的LIMIT子句用于限制由 SELECT 语句返回的数据数量基本语法如下# LIMIT [no of rows]这部分用来限制查询结果的行数。 #[no of rows] 是一个数字表示你想要返回的最大行数。 #如LIMIT 10那么查询将只返回最多10行数据 SELECT column1, column2, columnN FROM table_name LIMIT [no of row]3. SQLite的C接口笔者将对自己项目中所用到的核心API进行讲解通常情况下掌握以下几个足以够用。3.1 sqlite3_open函数该函数用于创建或者打开一个数据库文件并返回一个数据库对象参数如下所示int sqlite3_open( const char *filename, /* 数据库文件名UTF-8 */ sqlite3 **ppDb /* 输出数据库连接句柄 */ );以笔者项目为例用法如下所示static int open_database(const std::string db_path, sqlite3 **db) { if (sqlite3_open(db_path.c_str(), db) ! SQLITE_OK) { if (*db ! nullptr) { sqlite3_close(*db); //关闭数据库需要与sqlite3_open连用 *db nullptr; } return -1; } return 0; }3.2 sqlite3_exec函数该函数用于执行一条或多条SQL语句参数如下int sqlite3_exec( sqlite3 *db, /* 数据库连接 */ const char *sql, /* 要执行的 SQL 语句UTF-8 */ int (*callback)(void*, int, char**, char**), /* 结果回调函数 */ void *data, /* 传递给回调的第一个参数 */ char **errmsg /* 输出错误信息需要 sqlite3_free() 释放 */ );但需要注意的是该函数不适合处理大数据量对于大数据量需要使用sqlite3_prepare_v2()sqlite3_step()循环接下来对其进行讲解。3.3 sqlite3_prepare_v2函数该函数代表“准备”将 SQL 文本编译为字节码程序称为“预编译语句”并返回一个sqlite3_stmt句柄。其参数如下int sqlite3_prepare_v2( sqlite3 *db, /* 数据库连接 */ const char *zSql, /* SQL 语句UTF-8 */ int nByte, /* SQL 语句长度字节传 -1 表示自动计算到第一个 \0 */ sqlite3_stmt **ppStmt, /* 输出预编译语句句柄 */ const char **pzTail /* 输出指向未使用的 SQL 部分可传 NULL */ );需要注意的是如果需要执行参数化查询使用?或:name占位符则要通过sqlite3_bind_*()函数绑定值以将参数传递给预编译语句比如说将某个参数填充到SQL语句的占位符处。此外与创建预编译语句函数对应有一个销毁预编译语句函数sqlite3_finalize(sqlite3_stmt *pStmt)一般与sqlite3_prepare_v2函数搭配使用。3.4 sqlite3_step函数该函数代表“执行”表示执行一次预编译语句通常与sqlite3_prepare_v2函数连用参数如下int sqlite3_step(sqlite3_stmt *pStmt);其返回值如下所示SQLITE_ROW成功获取到一行数据可以通过sqlite3_column_*()函数读取列值。SQLITE_DONE语句执行完毕查询无更多行或非查询语句完成。SQLITE_BUSY数据库被锁定通常需要重试。SQLITE_ERROR、SQLITE_MISUSE等错误码。4. 总结上述仅仅是笔者在项目中用到的一些知识更完整的知识建议大家可以去菜鸟编程网站进行学习。5. 参考文献[1] SQLite – C/C | 菜鸟教程

相关文章:

SQLite数据库C++基础用法

1. 引言 笔者最近在做嵌入式Linux应用项目中需要用到SQLite数据库,因此本期分享一下其基础知识。SQLite 是一个嵌入式、无服务器的轻量级关系型数据库,它以函数库形式直接集成到应用程序中,将整个数据库存储为单个普通文件,无需安…...

Linux系统环境一键检测脚本:快速查看所有已安装的开发工具与版本

作者:尘一不染 | 2026-04-17 ———————————————— 版权声明:本文为CSDN博主「尘一不染」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 在日常的Linux开发或运维工作中,我们…...

llama.cpp部署QWEN3.5-9B和Gemma4-e4b,用Claude Code对比测试

昨天部署了Gemma4:26B和E4B,一是自己显存不够,部署的时候总是爆显存。二是claude code与Gemma4配合有问题,claude爆内存,任务进行不下去。 所以今天我又通过llama.cpp部署了QWEN3.9-9B,并做了些测试。 结论&#xff1a…...

HASH、MAC、HMAC 对比

对比汇总表--**Hash(散列)****MAC(消息认证码)****HMAC(哈希MAC)**全称Hash FunctionMessage Authentication CodeHash-based MAC输入任意长度消息消息 密钥消息 密钥输出固定长度摘要固定长度认证码固定…...

如何在3天内快速上手OpenSPG知识图谱引擎?完整实战指南 [特殊字符]

如何在3天内快速上手OpenSPG知识图谱引擎?完整实战指南 🚀 【免费下载链接】openspg OpenSPG is a Knowledge Graph Engine developed by Ant Group in collaboration with OpenKG, based on the SPG (Semantic-enhanced Programmable Graph) framework.…...

UnSHc深度解析:Shell脚本安全审计与逆向工程的技术实现

UnSHc深度解析:Shell脚本安全审计与逆向工程的技术实现 【免费下载链接】UnSHc UnSHc - How to decrypt SHc *.sh.x encrypted file ? 项目地址: https://gitcode.com/gh_mirrors/un/UnSHc 在Shell脚本安全领域,SHc加密工具因其强大的保护能力而…...

手机银行App模拟器

分享一款银行模拟器,农业银行模拟器,装逼娱乐神器,安卓苹果都支持!功能: 修改余额,自由修改数据,也可以模拟余额冻结和转出失败,功能多多,使用起来也是非常的方便,看图片…...

文件上传1

在日常使用各类网站、APP 的过程中,文件上传是我们每天都会接触的基础功能:更换社交账号头像、发布朋友圈配图、上传学习文档、提交作业文件、上传博客封面图…… 这些场景背后,都是Web 文件上传技术在支撑。一、文件上传核心原理解读在动手写…...

LVGL + SquareLine:嵌入式里「中英两套字串」怎么做(无需完整 i18n 框架)

LVGL + SquareLine:嵌入式里「中英两套字串」怎么做(无需完整 i18n 框架) 适用场景:ESP-IDF + LVGL,界面由 SquareLine Studio 生成;不想维护字符串 ID、gettext、.po 那一套,只希望 中文默认 UI + NVS 记忆语言 + 进屏刷新,英文尽量短以适应小屏。 1. 为什么不搞「正经…...

招聘类 Android 应用开发全栈实践与性能优化

引言 移动互联网时代,招聘平台已成为连接人才与企业的核心桥梁。作为 Android 开发工程师,负责招聘类应用的研发工作,不仅要求扎实的底层技术功底,更需要深刻理解招聘场景下的业务逻辑、用户交互特性以及对性能与稳定性的极致追求。本文将围绕一个招聘类 Android 应用从 0…...

Windows系统安装Node.js教程

Windows系统安装Node.js教程 本文档详细介绍了在Windows系统上安装Node.js的完整步骤,包括下载、安装和验证过程,帮助用户快速搭建Node.js开发环境。 一、Node.js 简介 Node.js 是一个基于 Chrome V8 引擎构建的开源、跨平台 JavaScript 运行时环境,它允许开发者在服务器…...

tinyalsa(0)

先给你一个完整配置 采样率(rate) 48000 声道数(channels) 2(左右声道) 采样格式 16bit(2字节) period_size 480 period_count 4一、先从“声音本…...

数据科学中的Pandas数据框扩展

在数据科学和机器学习的领域中,处理数据结构往往是日常工作的一部分。尤其是当我们需要处理图结构数据时,构建和操作邻接矩阵是常见任务之一。Pandas作为Python中处理数据的强大工具,提供了许多便捷的方法来操作数据框(DataFrame)。本文将探讨如何使用Pandas高效地扩展数据…...

龙虾量化实战法(QClaw)

龙虾量化上手法 如果你只是想快速搭一套能用的量化分析流程,这篇文章就是写给你的。最近市面上这类量化课程真的很多,讲得热闹,卖得也凶,但我个人一直不觉得这东西有多大价值。原因很简单,很多课讲到最后,还…...

关于FLOPs与MACs的说明

关于FLOPs与MACs的说明: 尽管通常被称为"FLOPs",但fvcore的FlopCountAnalysis返回的值实际上代表的是MACs(乘加运算次数)。 正如FlopCountAnalysis的文档字符串(第53行)所述:“我们将…...

算法学习第七天

1. 环形链表 II 总结链表与数组的适用场景差异,提交第一周学习小结 题意: 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,使用整数 pos…...

OpenCore Legacy Patcher终极解决方案:4步完整技术指南让旧Mac焕发新生

OpenCore Legacy Patcher终极解决方案:4步完整技术指南让旧Mac焕发新生 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是…...

Unity URP 实战:基于Kajiya-Kay与Marschner的头发着色器深度解析

1. 头发渲染为什么这么难? 第一次尝试做头发渲染的时候,我对着屏幕发呆了整整一天。为什么游戏里的头发看起来总是那么假?这个问题困扰了我很久。后来才发现,头发的光学特性比我们想象中复杂得多 - 每根头发实际上是个微型圆柱体&…...

基于c/c++实现linux/windows跨平台ntp时间戳服务器

目录使用场景c/c源码结果验证windows编译命令linux编译命令服务器输出结果客户端输出结果使用场景 在某些严格要求时间同步很精准的项目中,获取网络ntp时间的时间延时比较大,做滤波处理可能效果也不理想。因此可以搭建一个本地ntp服务器,这样…...

如何快速上手NVIDIA Profile Inspector:新手必看的完整显卡优化教程

如何快速上手NVIDIA Profile Inspector:新手必看的完整显卡优化教程 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 想彻底释放你的NVIDIA显卡性能吗?NVIDIA Profile Inspector正…...

做再生牛津布出口的靠谱公司有哪些?

做再生牛津布出口,想找个靠谱的伙伴,这事儿我太有感触了。 在这个行业里泡了五年,看过太多品牌方和采购朋友踩坑。要么是环保认证搞不定,货到了港口被卡住;要么是面料性能不达标,看着挺“绿”,用…...

对话式革新:OpenClaw全场景实战指南(含CloudBase开发全流程\+生态深度解析)

在AI原生工具爆发的2026年,鹅厂OpenClaw以“文本驱动、本地优先、事件编排”的核心优势,打破了传统AI助手“只建议、不执行”的局限,从单一工具升级为覆盖办公、创作、学习、研发等多场景的生态体系。它并非简单的对话机器人,而是…...

大学生如何准备AI面试

前两天一个学弟找我,说他投了十几家AI公司的算法岗,全军覆没。 他简历上写的是「熟悉Transformer架构」、「掌握PyTorch」、「参与过NLP相关项目」,看起来没什么毛病,但面试官一开口就问,「你训练过一个模型从零到上线…...

在国产麒麟系统上,手把手教你离线搞定osg3.4.0和osgEarth2.9的编译(附完整依赖包)

国产麒麟系统离线编译OSG 3.4.0与osgEarth 2.9全流程指南 在信创产业快速发展的背景下,国产操作系统与硬件平台正逐步成为关键基础设施的核心选择。银河麒麟作为国产操作系统的代表之一,其稳定性和安全性已得到广泛验证。然而,在三维地理信息…...

大模型时代最后的符号堡垒,正在崩塌?——全球首份AGI融合技术成熟度评估报告(Gartner未发布版节选)

第一章:大模型时代最后的符号堡垒,正在崩塌? 2026奇点智能技术大会(https://ml-summit.org) 符号主义曾是人工智能的基石——逻辑推理、形式化验证、可解释规则系统,构成了人类对“智能”的最初建模。然而,当大语言模…...

【2024 AGI迁移学习权威白皮书】:基于172个跨模态任务实测数据,揭示仅12.6%模型具备真正泛化迁移能力

第一章:AGI跨领域迁移学习能力的定义与核心挑战 2026奇点智能技术大会(https://ml-summit.org) AGI跨领域迁移学习能力,指通用人工智能系统在未经历显式训练的前提下,将从源任务(如自然语言理解)中习得的抽象表征、推…...

AGI武器化临界点已至:全球7国军方内部评估报告泄露,5个致命伦理漏洞亟待封堵

第一章:AGI武器化临界点的现实判定与战略警示 2026奇点智能技术大会(https://ml-summit.org) 当前,AGI武器化已脱离理论推演阶段,进入可实证观测的临界演化窗口。多国军事AI项目披露的自主决策延迟数据、开源大模型在红蓝对抗环境中生成战术…...

自指宇宙学研究大纲:存在如何通过自我描述而实在化(世毫九实验室原创理论)

自指宇宙学研究大纲:存在如何通过自我描述而实在化 作者:方见华 单位:世毫九实验室 1. 引言与理论背景 1.1 研究动机与问题提出 当代物理学面临着前所未有的理论困境。粒子物理标准模型与广义相对论在各自领域取得了极致成功,却始…...

Switch手柄在电脑上玩转PC游戏:BetterJoy功能详解与实战指南

Switch手柄在电脑上玩转PC游戏:BetterJoy功能详解与实战指南 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitcod…...

【maaath】Flutter for OpenHarmony 国际化集成指南:实现中英文动态切换

Flutter for OpenHarmony 国际化集成指南:实现中英文动态切换 欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net作者:maaath一、背景介绍 在移动应用开发中,国际化(Internationalization&#x…...