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

数据存储与SQLite数据库

一、数据存储结构分类

数据存储按“掉电/程序结束后数据是否保留”分为两类,核心差异及示例如下:

存储介质数据保留特性典型存储形式
内存掉电/程序结束后数据丢失数组、变量
硬盘掉电/程序结束后数据不丢失文件、数据库

二、常用数据库分类

数据库按数据存储结构分为“关系型”和“非关系型”,具体特点及代表产品如下:

1. 关系型数据库

  • 核心特点:将复杂数据简化为二维表格形式,结构固定。
  • 按规模分类
    • 大型:Oracle、DB2
    • 中型:MySQL、SQL Server
    • 小型:SQLite

2. 非关系型数据库

  • 核心特点:以键值对(如JSON格式)存储,数据结构不固定,灵活性高。
  • 代表产品:Redis、MongoDB

三、SQLite数据库核心特性

SQLite是轻量级小型关系型数据库,核心优势如下:

  1. 开源免费:基于C语言开发,开源免费,无版权费用。
  2. 体积轻量:代码量约1万行,总大小控制在10M以内。
  3. 跨平台易移植:文件型数据库(数据库对应单个文件),可直接移动使用,跨平台移植性好。
  4. 容量充足:理论最大数据容量可达2T。

四、SQLite3安装与测试

1. 安装命令(Linux环境)

  • 安装SQLite3本体:sudo apt-get install sqlite3(指定版本为3.22.0)
  • 安装相关开发库:sudo apt-get install libsqlite3-dev

2. 测试:创建数据库

执行命令 :sqlite3 xxx.db(将“xxx”替换为自定义数据库名),即可创建并进入目标数据库。

五、SQLite3学习要点

1. 支持的数据类型

类型说明
NULL空值
INTEGER整数类型
REAL浮点型(小数)
TEXT字符串类型
BLOB按输入原始格式存储

2. SQLite3常用命令(以“.”开头)

命令功能描述
.help查看所有支持的命令
.tables查看当前数据库中的所有表
.headers on/off开启/隐藏查询结果的表头
.mode column设置查询结果列左对齐
.quit退出SQLite数据库环境

3. SQLite3支持的SQL语句(关键规则:末尾必须加“ ; ”,不区分大小写)

(1)创建表
  • 语法:create table 表名(列名1 数据类型, 列名2 数据类型, ...);
  • 示例:create table class1(id INTEGER, name TEXT, age INTEGER, score REAL);
(2)插入数据
  • 语法:insert into 表名 values(值1, 值2, ...);(值需与列顺序匹配)
  • 示例:insert into class1 values(1, "zhangsan", 19, 88.5);
(3)查询数据
  • 查所有列:select * from 表名;
  • 查指定列:select 列名1, 列名2 from 表名;(注意“from”勿错写)
  • 条件查询:select * from 表名 where 列 条件;
    • 关系运算符:>、<、>=、<=、=、!=,逻辑符 and(与)、or(或)
    • 模糊查找(字符串):
      • 匹配多个字符:select * from 表名 where 列 like "%梅";(匹配“XX梅”“梅”等)
      • 匹配1个字符:select * from 表名 where 列 like "__梅";(仅匹配“XX梅”)
  • 排序查找:
    • 升序(默认):select * from 表名 order by 列名 ASC;
    • 降序:select * from 表名 order by 列名 DESC;
(4)删除数据
  • 语法:delete from 表名 where 删除条件;(无条件会删除全表数据)
  • 示例:delete from class1 where score < 80;(删除分数低于80的记录)
(5)修改数据
  • 语法:update 表名 set 列 = 新值 where 条件;(无条件会修改全表该列)
  • 示例:update class1 set score=100 where name="wanger";(将“wanger”的分数改为100)
(6)删除表
  • 语法:drop table 表名;(删除整个表结构及数据,不可恢复)
(7)设置主键自动增长列
  • 关键规则:
    1. 自动增长列必须是 INTEGER 类型;
    2. 创建表时需加 PRIMARY KEY AUTOINCREMENT
    3. 插入数据时,该列传NULL即可自动增长。
  • 示例:
    • 创建表:create table class2(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, score REAL);
    • 插入数据:insert into class2 values(NULL, "张三", 90);
(8)时间相关函数
  • 获取当前日期(年-月-日):date("now");
  • 获取当前时间(年-月-日 时:分:秒,+8小时时区):datetime("now", "+8 hours");

4. SQLite可视化工具

  • 安装:sudo apt-get install sqlitebrowser
  • 启动并打开数据库:sqlitebrowser xxx.db(“xxx.db”为目标数据库文件)

六、SQLite3的C/C++ API接口

1. sqlite3_open(打开数据库)

  • 功能:打开指定名称的数据库文件(若不存在则创建)。
  • 参数
    • filename:数据库文件名(UTF-8格式);
    • ppDb:保存数据库句柄(handle)的指针地址(用于后续操作)。
  • 返回值:成功返回SQLITE_OK,失败返回错误码。
  • 代码
#include <stdio.h>
#include <sqlite3.h>int main(int argc, char const *argv[])
{sqlite3 *pdb;int ret  = sqlite3_open("./stu.db", &pdb);if(ret != SQLITE_OK){fprintf(stderr, "sqlite3_open error : %s\n", sqlite3_errmsg(pdb));return -1;}char *psql = "create table if not exists class3(id INTEGER, name TEXT, score REAL);";ret = sqlite3_exec(pdb, psql, NULL,NULL,NULL);if(ret != SQLITE_OK){fprintf(stderr, "sqlite3_open error : %s\n", sqlite3_errmsg(pdb));sqlite3_close(pdb);return -1;}char sql[128] = {"insert into class3 values(1, \"马超\", 99);"};ret = sqlite3_exec(pdb, sql, NULL,NULL,NULL);if(ret != SQLITE_OK){fprintf(stderr, "sqlite3_open error : %s\n", sqlite3_errmsg(pdb));sqlite3_close(pdb);return -1;}sqlite3_close(pdb);return 0;
}

2. sqlite3_close(关闭数据库)

  • 功能:关闭已打开的数据库句柄,释放资源。
  • 参数sqlite3*类型的数据库句柄。

3. sqlite3_exec(执行SQL语句)

  • 功能:执行任意SQL语句(如创建表、插入、删除等,查询语句需配合回调函数)。
  • 参数
    • pdb:已打开的数据库句柄;
    • sql:待执行的SQL语句字符串;
    • callback:执行select查询时的回调函数(非查询语句可传NULL);
    • arg:传递给回调函数的自定义参数;
    • errmsg:保存执行错误信息的指针(需手动释放)。
  • 返回值:成功返回SQLITE_OK,失败返回错误码。

4. 回调函数(仅select查询时使用)

  • 定义int (*callback)(void* arg, int column, char** column_values, char** column_name);
  • 功能:查询到一条数据就调用一次,用于处理查询结果。
  • 参数
    • argsqlite3_exec传递的第4个自定义参数;
    • column:当前查询结果的列数;
    • column_values:指针数组,每个元素指向一列数据的字符串(所有数据均以字符串形式返回);
    • column_name:指针数组,每个元素指向一列的列名。
  • 注意事项
    1. 回调函数成功执行后必须返回0,否则会提示“sqlite3_exec error : query aborted”;
    2. 数据库查询结果全部以字符串类型返回(需自行转换为目标类型,如整数、浮点);
    3. 查询到N条数据,回调函数就会被调用N次。
  • 代码
#include <stdio.h>
#include <sqlite3.h>int flag = 0;int callback(void *arg, int column, char **values, char **name)
{if(flag == 0){for(int i = 0; i < column; i++){printf("%s ", name[i]);}printf("\n");flag = 1;}for(int i = 0; i < column; i++){printf("%s ", values[i]);}printf("\n");return 0;        // 必须要有返回值 成功 返回 0
}int main(int argc, char const *argv[])
{sqlite3 *pdb;int ret  = sqlite3_open("./stu.db", &pdb);if(ret != SQLITE_OK){fprintf(stderr, "sqlite3_open error : %s\n", sqlite3_errmsg(pdb));return -1;}char *psql = "select * from data;";ret = sqlite3_exec(pdb, psql, callback, NULL, NULL);if(ret != SQLITE_OK){fprintf(stderr, "sqlite3_exec error : %s\n", sqlite3_errmsg(pdb));sqlite3_close(pdb);return -1;}sqlite3_close(pdb);return 0;
}
http://www.dtcms.com/a/357489.html

相关文章:

  • 3 反向传播
  • C++ 线程安全初始化机制详解与实践
  • Android 打包适配15 版本(api 35)问题处理
  • 数字人 + 矩阵聚合系统源码搭建与定制化开发
  • 内网部署数据本地化,不限时的视频会议软件-BeeWorks Meet
  • 数据结构:归并排序 (Iterative Merge Sort)
  • JavaScript 基础核心知识点总结:从使用方式到核心语法
  • 不止于价格,DigitalOcean、AWS和Linode该选谁?
  • 蘑兔音乐:音乐创作板块的槿汐姑姑
  • 抗干扰、高冗余、快部署:KAXA工业无线方案赋能注塑车间稳定联网
  • OpenCV的轮廓检测
  • 手写MyBatis第41弹:MyBatis动态代理黑魔法:MapperProxy如何智能处理增删改的返回值?
  • 【完整源码+数据集+部署教程】胚胎发育阶段检测系统源码和数据集:改进yolo11-SCConv
  • 如何从 iCloud 存储中删除消息的 4 种方法
  • ubuntu24.04 QT中配置opencv4.12
  • 引力场能量为负,物质能量为正,这是在存在物质的空间中说的,如果是空无一物的空间呢,引力场能量还是负吗(或者说引力场还存在吗)
  • 2025年09月计算机二级Java选择题每日一练——第十一期
  • Vue3 kkfileview 的使用
  • Hal aidl 模板
  • Django开发规范:构建可维护的AWS资源管理应用
  • 第八章 惊喜01 测试筹备会
  • 【Flask】测试平台开发,产品管理实现编辑功能-第六篇
  • 对接连连支付(七)-- 退款查询
  • CSS设置滚动条显示时机及样式
  • R 语言 + 卒中 Meta 分析(续):机器学习 Meta 与结构方程 Meta 完整实现
  • STM32之IIC详解
  • GY-BMP280压强传感器完整工程stm32控制
  • 嵌入式滤波算法模块
  • 换公司如何快速切入软件项目工程
  • vant Overlay 遮罩层内元素无法滚动解决方案