欢迎各位读者来到本篇博客!今天我们将一起走进 SQLite3 的世界,从基础概念到 C/C++ API 实战,循序渐进地掌握这款轻量级嵌入式数据库的核心用法。无论你是刚接触数据库的初学者,还是希望快速上手 SQLite3 的开发者,本文都会为你提供清晰、完整的讲解。让我们开始吧!
1. 数据库文件与普通文件区
1.普通文件对数据管理(增删改查)效率低
2.数据库对数据管理效率高,使用方
2. 常用数据库
2.1 关系型数据库
关系型数据库将复杂的数据结构简化为二维表格形式,是目前应用最广泛的数据库类型。根据规模不同,常见的关系型数据库可分为以下几类:
- 大型:Oracle、DB2
- 中型:MySQL、SQLServer
- 小型:SQLite
2.2 非关系型数据库
非关系型数据库以键值对存储,且结构不固定,适合处理灵活多变的数据模型。常见的非关系型数据库包括:
- JSON:轻量级数据交换格式
- Redis:基于内存的键值存储数据库
- MongoDB:文档型数据库
2.3 嵌入式数据库
SQLite3 是一款典型的嵌入式数据库,具有以下特点:
- 开源免费,使用 C 语言开发
- 代码量少,约 1 万行左右,总大小 10M 以内
- 文件型数据库,可以随意移动
- 数据容量最大可达 2T
2.4 SQLite3 的安装
在 Ubuntu 系统中,可以通过以下命令在线安装 SQLite3:
bash
sudo apt-get install sqlite3
sudo apt-get install libsqlite3
2.5 SQLite3 相关命令
创建数据库:
bash
sqlite3 xxx.db
进入数据库后,常用的命令如下:
.help 查看帮助信息
.tables 查看数据库中的表名
.headers on/off 打开/关闭表头
.mode column 设置表左对齐
.quit 退出数据库
2.6 SQLite3 提供的 SQL 语句
SQLite3 支持标准的 SQL 语法,且不区分大小写。其数据类型包括:
- NULL:空类型
- INTEGER:整数类型
- REAL:浮点型
- TEXT:字符串类型(文本)
- BLOB:根据输入确定
2.6.1 创建表
sql
CREATE TABLE 表名(列名1 数据类型1, 列名2 数据类型2, 列名3 数据类型3);
示例:
sql
CREATE TABLE class1(id INTEGER, name TEXT, score REAL);
2.6.2 插入数据
sql
INSERT INTO 表名 VALUES(值1, 值2, 值3);
示例:
sql
INSERT INTO class1 VALUES(1, "zhangsan", 88.5);
注意:TEXT 类型的数据,插入时需要用双引号或单引号引起来。
2.6.3 查找数据
查找数据库中的所有数据:
sql
SELECT * FROM 表名;
查找指定列数据:
sql
SELECT 列名1, 列名2 FROM 表名;
条件查找:
sql
SELECT * FROM 表名 WHERE 列 关系运算符 值;
示例:
sql
SELECT * FROM class1 WHERE id = 1;
关系运算符包括:=、>、>=、<=、<、!=。
连接多个条件可以使用 AND 和 OR。
模糊查找:
%:模糊匹配若干个字符_:模糊匹配一个字符
示例:
sql
SELECT * FROM class1 WHERE name LIKE "马%";
sql
SELECT * FROM class1 WHERE name LIKE "马__";
有序查找:
sql
SELECT * FROM 表名 ORDER BY 列名 ASC; -- 升序显示
sql
SELECT * FROM 表名 ORDER BY 列名 DESC; -- 降序显示
2.6.4 删除数据
sql
DELETE FROM 表名 WHERE 条件;
2.6.5 修改数据
sql
UPDATE 表名 SET 列 = 新值 WHERE 条件;
2.6.6 删除表
sql
DROP TABLE 表名;
2.6.7 主键值自动增长
sql
CREATE TABLE 表名(列名 INTEGER PRIMARY KEY AUTOINCREMENT, 列名 数据类型);
2.7 数据库的可视化工具
在 Ubuntu 系统中,可以安装 SQLiteBrowser 进行可视化操作:
bash
sudo apt-get install sqlitebrowser
打开数据库:
bash
sqlitebrowser xxx.db
在 Windows 系统中,可以使用 Navicat for SQLite 进行数据库可视化操作。
7. sqlite3 提供的 C/C++ API 接口
sqlite3 提供了丰富的 C/C++ API,方便开发者在程序中直接操作数据库。本节将重点介绍三个最常用的接口:sqlite3_open 、sqlite3_errmsg 和 sqlite3_exec,并结合示例代码帮助大家快速上手。
7.1 打开数据库:sqlite3_open
在使用 sqlite3 之前,首先需要打开(或创建)一个数据库文件。sqlite3_open 函数用于完成这一操作。
c
int sqlite3_open(
const char *filename, /* 数据库文件名 (UTF-8) */
sqlite3 **ppDb /* 输出:数据库句柄 */
);
**功能:**打开一个数据库文件,如果文件不存在则自动创建。
参数说明:
- filename:数据库文件名,例如 "stu.db"。
- ppDb:用于保存数据库句柄的指针,类型为 sqlite3 *。
返回值:
- 成功:返回 SQLITE_OK。
- 失败:返回错误码。
示例代码:
c
#include <stdio.h>
#include <sqlite3.h>
int main() {
sqlite3 *db = NULL;
int rc = sqlite3_open("stu.db", &db);
if (rc != SQLITE_OK) {
printf("打开数据库失败: %s\n", sqlite3_errmsg(db));
return -1;
}
printf("数据库打开成功!\n");
sqlite3_close(db);
return 0;
}
7.2 获取错误信息:sqlite3_errmsg
当数据库操作出错时,可以通过 sqlite3_errmsg 获取对应的错误描述信息,便于排查问题。
c
const char *sqlite3_errmsg(sqlite3 *pdb);
**功能:**获取当前数据库错误码对应的错误信息字符串。
参数说明:
- pdb:数据库句柄。
**返回值:**错误信息字符串。
示例代码:
c
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL 错误: %s\n", sqlite3_errmsg(db));
}
7.3 执行 SQL 语句:sqlite3_exec
sqlite3_exec 是 sqlite3 中最常用的接口,可以执行任意 SQL 语句(建表、插入、查询、删除、更新等)。
c
int sqlite3_exec(
sqlite3 *pdb, /* 数据库句柄 */
const char *sql, /* 要执行的 SQL 语句 */
int (*callback)(void*, int, char**, char**), /* 回调函数 */
void *arg, /* 传递给回调函数的参数 */
char **errmsg /* 错误信息输出 */
);
**功能:**执行一条或多条 SQL 语句。
参数说明:
- pdb:数据库句柄。
- sql:要执行的 SQL 语句字符串。
- callback:回调函数指针,当执行 SELECT 查询且查询到数据时,每行数据都会触发一次回调。
- arg:传递给回调函数的参数(实参)。
- errmsg:用于保存出错信息的指针。
返回值:
- 成功:返回 SQLITE_OK。
- 失败:返回错误码。
7.3.1 回调函数详解
c
int callback(void *arg, int n, char **value, char **name);
**功能:**当 SELECT 查询到数据时执行的回调函数。
参数说明:
- arg:由 sqlite3_exec 的第 4 个参数传递过来的值(形参)。
- n:SELECT 查询结果集的列数。
- value:每一列的值,类型为 char *value\[\]。
- name:每一列的字段名(表头),类型为 char *name\[\]。
返回值:
- 成功:返回 0。
- 失败:返回非 0。
示例代码:
c
#include <stdio.h>
#include <sqlite3.h>
int callback(void *arg, int n, char **value, char **name) {
for (int i = 0; i < n; i++) {
printf("%s = %s\n", name[i], value[i] ? value[i] : "NULL");
}
printf("------------------\n");
return 0;
}
int main() {
sqlite3 *db = NULL;
char *errmsg = NULL;
sqlite3_open("stu.db", &db);
// 创建表
char *sql_create = "CREATE TABLE IF NOT EXISTS class1(id INTEGER, name TEXT, score REAL);";
sqlite3_exec(db, sql_create, NULL, NULL, &errmsg);
// 插入数据
char *sql_insert = "INSERT INTO class1 VALUES(1, 'zhangsan', 88.5);";
sqlite3_exec(db, sql_insert, NULL, NULL, &errmsg);
// 查询数据(触发回调)
char *sql_select = "SELECT * FROM class1;";
sqlite3_exec(db, sql_select, callback, NULL, &errmsg);
sqlite3_close(db);
return 0;
}
7.4 使用注意事项
callback 必须要有返回值,返回 0 表示正常,返回非 0 表示异常。
当 SELECT 查询数据时,每找到一条数据,callback 就会被触发一次。
数据库中的数据通过 SELECT 查询出来时,统一按照字符串处理。
7.5 本章小结
本节介绍了 sqlite3 的三大核心 API:sqlite3_open 负责打开数据库,sqlite3_errmsg 负责错误信息获取,sqlite3_exec 负责执行 SQL 语句。其中 sqlite3_exec 的回调机制是查询数据的关键,需要重点掌握。建议读者结合示例代码动手实践,加深理解。