一、数据库基础认知
1. 数据库核心价值
数据库是 "数据的仓库",即使面对海量数据,也能实现:
- 安全存储数据;
- 高效的统计分析;
- 数据的增删改查(CRUD)管理。嵌入式设备中引入数据库,可解决传统文件存储数据混乱、查询效率低的问题。
2. 数据库核心结构
plaintext
库 → 表(行、列) → 记录(行) → 字段(列)
- 库:数据的容器,一个数据库可包含多张表;
- 表:数据的组织单元,由行(记录)和列(字段)组成;
- 记录:一行数据,代表一个完整的实体信息;
- 字段:一列数据,代表实体的某个属性(如 id、name)。
3. 数据库分类与常见名词
(1)数据库分类(按规模)
| 规模 | 代表产品 | 适用场景 |
|---|---|---|
| 大型 | ORACLE、DB2 | 企业级核心业务、海量数据存储 |
| 中型 | MySQL、MSSQL | 中小型系统、互联网应用 |
| 小型 | SQLite3、powdb | 嵌入式设备、轻量级应用 |
(2)核心名词
- DB:数据库(Database),存储数据的集合;
- DBMS:数据库管理系统(Database Management System),管理数据库的软件(如 SQLite3);
- MIS:管理信息系统(Management Information System),基于数据库的业务管理系统;
- OA:办公自动化(Office Automation),数据库驱动的办公系统。
二、嵌入式首选:SQLite3 核心特性
SQLite3 是遵循 GNU 开源协议的嵌入式关系型数据库,由 C 语言开发,专为轻量级场景设计,核心特点如下:
- 极致轻量:核心代码仅 1 万行左右,安装包总大小 10M 以内,适配资源受限的嵌入式设备;
- 无需安装:绿色软件,无需配置服务、无需依赖第三方库,开箱即用;
- 文件型数据库:数据存储在单一文件中,可直接移动、拷贝,部署便捷;
- 容量上限高:单数据库文件最大支持 2TB,满足嵌入式场景的海量数据需求;
- 跨平台:支持 Linux、Windows、嵌入式系统(如 RTOS)等多平台。
三、SQLite3 安装与环境配置(Linux)
1. 安装核心包
bash
运行
# 安装sqlite3命令行工具
sudo apt-get install sqlite3
# 安装开发库(用于C语言编程)
sudo apt-get install libsqlite3-dev
2. 编译 C 语言程序
编写 SQLite3 程序后,编译时需链接sqlite3库:
bash
运行
gcc test.c -lsqlite3 -o test
四、SQLite3 常用指令与 SQL 语句
1. 核心指令(终端交互)
启动 SQLite3:sqlite3 数据库名.db(若数据库不存在则自动创建)。
| 指令 | 功能 |
|---|---|
.database |
查看数据库关联的物理文件 |
.table |
列出数据库中的所有表 |
.schema |
显示表的创建语句(建表结构) |
.q/.quit/.exit |
退出 SQLite3 终端 |
.header on |
显示查询结果的表头(字段名) |
2. 核心 SQL 语句(必须以分号结尾)
(1)创建表
sql
create table user(id int, name char, age int);
(2)删除表
sql
drop table user;
(3)插入数据
sql
insert into user values(3,"wang",11);
(4)查询数据
sql
-- 查询age大于20或小于50的所有记录
select * from user where age>20 or age<50;
(5)修改数据
sql
-- 将name为'li'的记录的id改为1
update user set id = 1 where name = 'li';
(6)删除数据
sql
-- 删除id为1或2的记录
delete from user where id = 1 or id = 2;
五、C 语言操作 SQLite3 实战
SQLite3 提供简洁的 C 语言 API,核心流程为:打开数据库 → 执行 SQL 语句 → 关闭数据库。
1. 核心 API 说明
| 函数 | 功能 |
|---|---|
sqlite3_open() |
打开 / 创建数据库,返回数据库句柄 |
sqlite3_exec() |
执行 SQL 语句(增删改查) |
sqlite3_close() |
关闭数据库句柄 |
sqlite3_errmsg() |
获取错误信息 |
sqlite3_free() |
释放错误信息内存 |
2. 完整示例:插入数据到数据库
c
运行
#include <stdio.h>
#include <sqlite3.h>
int main(int argc, char** argv)
{
// 数据库句柄
sqlite3* db = NULL;
// 打开/创建123.db数据库
int ret = sqlite3_open("123.db", &db);
if (ret != SQLITE_OK)
{
fprintf(stderr, "打开数据库失败:%s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
// 定义要执行的SQL语句
char* errmsg = NULL;
char sql_cmd[512] = "insert into user values(6,'lvbu',31);";
// 执行SQL语句
ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
if (ret != SQLITE_OK)
{
fprintf(stderr, "执行SQL失败:%s\n", errmsg);
sqlite3_free(errmsg); // 释放错误信息内存
sqlite3_close(db);
return 1;
}
printf("数据插入成功!\n");
// 关闭数据库
sqlite3_close(db);
return 0;
}
3. 代码说明
sqlite3_open:第一个参数为数据库文件名,第二个参数为输出型参数,返回数据库句柄;sqlite3_exec:第二个参数为要执行的 SQL 语句,最后一个参数接收错误信息;- 错误处理:执行失败时需通过
sqlite3_errmsg获取详情,且errmsg需手动释放内存; - 收尾:无论执行成功与否,都需调用
sqlite3_close关闭数据库句柄,避免资源泄漏。
六、嵌入式场景应用建议
- 数据存储优化:嵌入式设备中建议将数据库文件存储在 Flash/SD 卡中,避免频繁写入内存;
- SQL 语句简化:嵌入式场景优先使用简单 SQL 语句,减少数据库运算开销;
- 错误处理强化:嵌入式设备无交互界面,需将数据库操作错误日志写入本地文件,方便调试;
- 并发控制 :SQLite3 默认支持单线程,多线程场景需加锁或使用
sqlite3_threadsafe()配置线程安全。
七、总结
SQLite3 以轻量、易用、跨平台的特性,成为嵌入式开发中数据管理的最优解。掌握其基础指令、SQL 语句及 C 语言编程接口,可快速实现嵌入式设备的海量数据存储与管理。无论是智能家居、工业控制还是物联网设备,SQLite3 都能以极小的资源开销,满足数据增删改查的核心需求。