6.2 SQLite数据存储
SQLite简介
SQLite 是一个轻量级的关系型数据库管理系统(RDBMS)**,它被设计为嵌入式数据库,广泛用于移动设备、桌面软件、浏览器、IoT 设备等场景中。
主要特点
特点 | 描述 |
---|---|
轻量级 | 不需要安装,单个 .db 文件即可运行;库文件小(一般 < 1MB) |
嵌入式 | SQLite 是一个嵌入式数据库,不像 MySQL、PostgreSQL 那样需要独立的服务器进程 |
零配置 | 不需要配置或启动服务,开箱即用 |
跨平台 | 支持 Windows、Linux、macOS、Android、iOS 等 |
事务支持 | 支持原子性、隔离性、一致性、持久性(ACID)事务机制 |
标准 SQL 支持 | 支持大部分 SQL-92 标准,包括 SELECT ,INSERT ,UPDATE ,DELETE ,JOIN 等操作 |
单文件数据库 | 所有数据(表、索引、事务日志等)都保存在一个普通磁盘文件中 |
高可靠性 | 经广泛测试,被多个大型项目采纳(如 Chrome、Firefox、Android 系统) |
可扩展性 | 支持用户自定义函数、扩展模块、虚拟表(Virtual Tables)等机制 |
SQLite 的使用场景
- 移动应用(如 Android 默认数据库)
- 嵌入式设备(如路由器、POS 机、IoT)
- 浏览器本地数据库(如 Firefox、Chrome 使用 SQLite 存储配置)
- 桌面软件(如 Adobe、Skype 使用 SQLite 保存用户数据)
- 数据分析或原型开发(轻量快速部署)
- 单用户或嵌入式系统的轻量数据库解决方案
基础SQL操作语句
-- 创建表
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER
);
-- 插入数据
INSERT INTO users (name, age) VALUES ('Alice', 25);
-- 查询数据
SELECT * FROM users;
-- 更新数据
UPDATE users SET age = 26 WHERE name = 'Alice';
-- 删除数据
DELETE FROM users WHERE name = 'Alice';
程序调用
BK系列控制器支持SQLite的使用,您可以根据项目的实际需求进行相关数据库的创建读写。
准备工作
当您的项目中需要使用SQLite时,推荐使用 sqlite3
C API,在您的工程中导入 sqlite3.h
头文件,并引入 libsqlite3.so
数据库、表创建
通过 sqlite3_open
函数进行数据的打开,当数据库不存在时会自动进行创建,可以通过返回值查看数据库是否创建成功。
// 打开数据库(不存在则创建)
int rc = sqlite3_open("test.db", &db);
if (rc != SQLITE_OK && rc != SQLITE_DONE && rc != SQLITE_ROW)
{
std::cerr << "Error: open db failed。 " << " (" << sqlite3_errstr(rc) << ")" << std::endl;
exit(1);
}
数据库打开成功后,即可进行表的创建,对于表的创建操作,需要组装SQL语句执行
// 创建表SQL
const char *create_sql = R"sql(
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER
);
)sql";
//执行创建SQL语句
rc = sqlite3_exec(db, create_sql, nullptr, nullptr, nullptr);
数据增删改查
与创建数据表一样,数据的增删改查也要先组装好对应的SQL语句,然后执行SQL语句
// 插入数据(使用预处理语句)
const char *insert_sql = "INSERT INTO users (name, age) VALUES (?, ?);";
// stmt语句句柄
sqlite3_stmt *stmt;
rc = sqlite3_prepare_v2(db, insert_sql, -1, &stmt, nullptr);
const char *names[] = {"Alice", "Bob", "Charlie"};
int ages[] = {25, 30, 35};
for (int i = 0; i < 3; ++i)
{
sqlite3_bind_text(stmt, 1, names[i], -1, SQLITE_STATIC);
sqlite3_bind_int(stmt, 2, ages[i]);
rc = sqlite3_step(stmt);
sqlite3_reset(stmt); // 复用语句
}
//清理语句句柄,准备执行下一个语句
sqlite3_finalize(stmt);
// 查询数据
const char *select_sql = "SELECT id, name, age FROM users;";
rc = sqlite3_prepare_v2(db, select_sql, -1, &stmt, nullptr);
// 每调一次sqlite3_step()函数,stmt语句句柄就会指向下一条记录
while ((rc = sqlite3_step(stmt)) == SQLITE_ROW)
{
// 取出第0列字段的值
int id = sqlite3_column_int(stmt, 0);
const unsigned char *name = sqlite3_column_text(stmt, 1);
// 取出第1列字段的值
int age = sqlite3_column_int(stmt, 2);
std::cout << "ID: " << id << ", Name: " << name << ", Age: " << age << std::endl;
}
//清理语句句柄,准备执行下一个语句
sqlite3_finalize(stmt);
// 更新数据
const char *update_sql = "UPDATE users SET age = age + 1 WHERE name = 'Alice';";
rc = sqlite3_exec(db, update_sql, nullptr, nullptr, nullptr);
// 删除数据
const char *delete_sql = "DELETE FROM users WHERE name = 'Charlie';";
rc = sqlite3_exec(db, delete_sql, nullptr, nullptr, nullptr);
关闭数据库
数据使用完成后,应及时关闭数据库