跳转至

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);

关闭数据库

数据使用完成后,应及时关闭数据库

// 关闭数据库
sqlite3_close(db);