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

嵌入式学习(day37) 数据库 Sqlite相关命令函数

数据存储:

变量、数组、数据存储结构 ----》内存:掉电或程序运行结束,数据丢失

文件、数据库 ----》硬盘:掉电或者程序运行结束,数据不丢失

1.常用数据库:关系型数据库和非关系型数据库

关系型数据库:将复杂的数据结构简化为二维表格形式:大型:Oracle、DB2  中型的:MySql、SQLServer  小型:Sqlite

非关系型数据库:以键值对存储,且结构不固定 Redis MongoDB

2.sqlite数据库:开源免费,C语言开发。代码量少,一万行左右,总大小10M以内,文件型数据库,可以移动,跨平台移植性好,理论数据容量最大2T

3.安装sqlite数据库:sudo apt-get install sqlite3

安装相关库:sudo apt-get install libsqlite3-dev

测试 创建一个名为xxx.db的数据库 sqlite3 xxx.db

4、sqlite3学习

sqlite支持的数据类型:NULL 空值、INTEGER 整型、REAL 浮点型、TEXT 字符串型 BLOB 根据输入进行存储。

1) sqlite3 相关的命令
.help                    查看支持的命令
.tables                  查看当前数据库中的表
.headers on/off          打开或者隐藏表头
.mode column             设置列左对齐
.quit                    退出数据库

2) sqlite3 支持的SQL语句
注意:
1. SQL语句后面必须要有分号;
2. sqlite不区分大小写

1. 创建表
create table 表名(列名1 数据类型, 列名2 数据类型, 列名3 数据类型);
create table class1(id INTEGER, name TEXT, age INTEGER, score REAL);

2. 数据插入
insert into 表名 values(值1, 值2, 值3);
insert into class1 values(1, "zhangsan", 19, 88.5);

3. 查询数据
查询所有列数据:
select * from 表名;

 查询指定列数据:
select 列名1, 列名2, 列名n from 表名;

 条件查询
SELECT * FROM 表名 WHERE 列 条件;

关系运算符
>    <    >=    <=    =    !=

逻辑运算符
AND  --> &&
OR   --> ||

模糊查找(字符串)
SELECT * FROM 表名 WHERE 列 LIKE "%梅";
SELECT * FROM 表名 WHERE 列 LIKE "__梅";

通配符说明:
% : 可以模糊匹配多个字符
_ : 只能模糊匹配一个字符

 排序查找
-- 升序排序
SELECT * FROM 表名 ORDER BY 列名 ASC;

降序排序
SELECT * FROM 表名 ORDER BY 列名 DESC;

4. 删除数据
DELETE FROM 表名 WHERE 删除的条件;
DELETE FROM class1 WHERE score < 80;

5. 修改数据
UPDATE 表名 SET 列=新值 WHERE 条件;
UPDATE class1 SET score=100 WHERE name="wanger";

 6. 删除一张表
DROP TABLE 表名;

7. 设置主键值自动增长列    注意:
-- 1. 主键值自动增长列必须是 INTEGER 类型
-- 2. 在创建表时,主键值自动增长列要增加: PRIMARY KEY AUTOINCREMENT

CREATE TABLE class2 (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
score REAL
);

-- 3. 插入数据时,主键值自动增长列给 NULL,让其自动增长
INSERT INTO class2 VALUES(NULL, "张三", 90);

8. 时间相关函数
-- 获取当前日期:年-月-日
date("now");

获取指定时间(如+8小时):年-月-日 时:分:秒
datetime("now", "+8 hours");

sqlite 的可视化工具
-- 安装命令(Linux)
sudo apt-get install sqlitebrowser

启动工具
sqlitebrowser xxx.db

3) sqlite3 提供的 C/C++ API(应用程序接口)

函数:打开一个数据库文件
int sqlite3_open(
const char *filename,  /* Database filename (UTF-8) */
sqlite3 **ppDb         /* OUT: SQLite db handle */
);

功能:打开一个数据库文件
参数:  filename: 数据库文件名称、 ppDb: 保存数据库句柄指针的地址
返回值:  成功:SQLITE_OK、 失败:错误码。

函数:关闭数据库
int sqlite3_close(sqlite3 *);

函数:执行 SQL 语句
int sqlite3_exec(
sqlite3 *pdb,           /* An open database */
const char *sql,        /* SQL to be evaluated */
int (*callback)(void*, int, char**, char**), /* Callback function */
void *arg,              /* 1st argument to callback */
char **errmsg           /* Error msg written here */
);

功能:执行 SQL 语句

参数:
pdb: 数据库句柄
sql: 要执行的 SQL 语句
callback: 回调函数(用于处理查询结果)

  arg: 传递给回调函数的第一个参数
errmsg: 错误信息输出地址(可选)

返回值:

成功:SQLITE_OK  失败:错误码。

回调函数原型(用于 sqlite3_exec 执行 SELECT 语句时)
int (*callback)(void *arg, int column, char **column_values, char **column_name);

功能:执行 SELECT 语句时被调用的回调函数
参数说明:
arg: sqlite3_exec 传递的第四个参数(用户自定义数据)
column: 查询结果的列数
column_values: 指针数组,每个元素指向对应列的数据字符串
column_name: 指针数组,每个元素指向对应列的列名

注意事项:
1. 回调函数必须返回 0 表示成功,否则 sqlite3_exec 会报错:
"sqlite3_exec error: query aborted"
2. 从数据库查询出来的所有数据,统一以字符串类型返回(即使原数据是整数或浮点数)
3. 每查到一条记录,回调函数就会被调用一次。

提高 SQLite 数据插入效率:

1. 开启事务机制

所谓“事务”就是指一组 SQL 命令,这些命令要么一起执行,要么都不被执行。
在 SQLite 中,每调用一次 sqlite3_exec() 函数,就会隐式地开启一个事务。
如果插入一条数据就调用一次该函数,事务就会被反复地开启和关闭,从而增大 IO 量。

如果在插入数据前显式开启事务,插入完成后统一提交,则会大大提高 IO 效率,显著加快数据插入速度。

eg:

开启事务:
BEGIN;

将事务的修改保存到数据库中:
COMMIT;

sqlite3_exec(db, "begin;", NULL, NULL, NULL);
for (int i = 0; i < nCount; ++i)
{
sqlite3_exec(db, sql, NULL, NULL, NULL);
}
sqlite3_exec(db, "commit;", NULL, NULL, NULL);

 函数:获取当前时间(可精确到微妙)
int gettimeofday(struct timeval *tv, struct timezone *tz);

功能:获取当前的时间(可以精确到微妙)

参数说明:
tv: 指向 struct timeval 的指针,用于存储当前时间

   tz: 指向 struct timezone 的指针(通常传 NULL,表示不使用时区信息)

struct timeval 结构体定义:
struct timeval {
time_t     tv_sec;    /* 秒数(seconds) */
suseconds_t tv_usec;  /* 微秒数(microseconds) */
};

http://www.xdnf.cn/news/1416475.html

相关文章:

  • Flutter 本地持久化存储:Hive 与 SharedPreferences 实战对比
  • 基于FPGA的多协议视频传输IP方案
  • Kubernetes 中根据 Pod IP 查找 Pod 及关联服务的方法
  • Fiddler抓包原理及教程(附带解决高版本Android抓包无网络问题)
  • 【Android】Span富文本简介
  • Python 爬虫案例:爬取豆瓣电影 Top250 数据
  • 华为云CCE
  • 【Flask】测试平台开发,实现全局邮件发送工具 第十二篇
  • [免费]基于Python的气象天气预报数据可视化分析系统(Flask+echarts+爬虫) 【论文+源码+SQL脚本】
  • 【Proteus仿真】蜂鸣器控制系列仿真——蜂鸣器控制/蜂鸣器播放音乐/蜂鸣器播放多种音乐/蜂鸣器和LED组成报警装置
  • 如何在Github中创建仓库?如何将本地项目上传到GitHub中?
  • 【HTML】draggable 属性:解锁网页交互新维度
  • 深入探讨Java异常处理:受检异常与非受检异常的最佳实践
  • 领码方案:低代码平台前端缓存与 IndexedDB 智能组件深度实战
  • Eclipse Compiler for Java (ECJ):安装指南与高效快捷键全解析
  • 玩转OurBMC第二十一期:前端页面仪表盘的设计与使用实践
  • Trae x MCP:一键打造品牌专属高质量SVG封面
  • CompletableFuture初体验
  • (9.1)Python测试之记录
  • Shell 编程 —— 正则表达式与文本处理器
  • 函数,数组与正则表达式
  • Android原生HttpURLConnection上传图片方案
  • 打造智能写作工作流:n8n + 蓝耘MaaS平台完整实战指南
  • Apollo学习之决策模块
  • 【Linux手册】Unix/Linux 信号:原理、触发与响应机制实战
  • Ajax笔记(下)
  • 在.NET标准库中进行数据验证的方法
  • Java视觉跟踪入门:使用OpenCV实现实时对象追踪
  • 【开题答辩全过程】以 基于php的校园兼职求职网站为例,包含答辩的问题和答案
  • 【Android】使用Handler做多个线程之间的通信