数据存储
|--------------|------|------------------|
| 类型 | 存储位置 | 掉电或者程序运行结束后的数据后果 |
| 变量、数组等数据存储结构 | 内存 | 丢失 |
| 文件 | 硬盘 | 不丢失 |
| 数据库 | 硬盘 | 不丢失 |
与文件相比,数据库是一种专业的存储数据的结构,其中包含一系列算法用来查找等操作,所以一般来说少量数据用文件存储,大量数据用数据库存储
常用的数据库
1.关系型数据库:(例如Excel)
将复杂的数据结构简化为二维表格形式
大型:Oracle、DB2
中型:MySql、SQLServer
小型:Sqlite
2.非关系型数据库
以键值对存储,且结构不固定,相对来说使用起来比较复杂
//JSON
Redis
MongoDB
sqlite数据库
优势:
1.开源免费, 用c语言开发
2.代码量少,1万行左右,总大小10M以内
3.文件型数据库,可以移动,跨平台移植性好
4.理论数据容量最大2T
安装sqlite3数据库
命令:sudo apt-get install sqlite3
安装相关库:sudo apt-get install libsqlite3-dev
测试是否安装完成密令:sqlite3 xxx.db,创建一个名为xxx的数据库,成功则如下

sqlite3相关的命令
1,.help:查看支持的命令
2, .tables:查看当前数据库中的表
3,.headers on|off:显示或隐藏表头
4,.mode column:设置左对齐
5,.quit:退出
https://www.runoob.com/sqlite/sqlite-tutorial.html
sqlite支持的数据类型
存储类型

NULL:空值
INTEGER:整型
REAL:浮点型
TEXT:字符串类型
BLOB:根据输入进行储存,相当于void*
注:不区分大小写
亲和类型

sqlite3提供的SQL语句
创建表
create table 表名(列名1 类型, 列名2 数据类型...);
注意:SQL语句后面必须要有分号,以点.开头的语句不需要分号



出现第一种情况是因为后面没有打分号,补上分号即可
添加数据
insert into 表名 values(值1, 值2, 值3...);

注:方括号可以省略
查询数据
1,查询所有列数据:select * from 表名;
2,查询指定列数据:select 列名1, 列名2...列名n from 表名;

3,查询满足条件的数据:select * from 表名 where 列名 条件...;
适用的关系运算符:>,<,>=,<=,=,!=
多个条件:
且:and
或:or
4,模糊查找(只适合字符串):

select * from 表名 where 列 like "%详细信息"
select * from 表名 where 列 like "_详细信息"
%:可以匹配多个字符
_:只能匹配一个字符,一个下划线相当于一个字符

排序
升序||降序:select * from 表名 order by 列名 ASC||DESC

删除数据
delete from 表名 where 删除的条件;

修改数据
update 表名 set 列=新值 where 条件;

删除表
drop table 表名

设置主键值自动增长列
创建表时,在列名后添加PRIMARY KEY AUTOINCREMENT(可以按Tab自动补齐)
插入数据时,主键值自动增长列给NULL,使其自动增长
注意:只能是INTEGER类型,亲和类型都不行

时间相关
date("now"); 年-月-日
datetime("now") 年-月-日 时:分:秒




注:东八区时区时差八个小时,所以可以如下加入修饰符


安装sqlite可视化工具
命令:sudo apt-get install sqlitebrowser


sqlite3提供的C/C++ API接口

sqlite3_open


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


功能:返回错误信息字符串
sqlite3_close

功能:关闭数据库
sqllite3_exec()

功能:执行SQL语句
参数:
第一个:数据库句柄
sql:要执行的sql语句
callback:回调函数,执行select语句时使用
函数功能:执行select语句时调用的回调函数
参数:
1:sqlite3_exec传递的第四个参数
2:查询到的数据的列数
3:指针数组,多个指针分别指向每一列数据的字符串
4:指针数组,指向每一列的列名
arg:给callback传递的实参
errmsg:用来保存出错信息
返回值:
成功:SQLITE_OK
失败:错误码


出现这种情况是因为没有连接数据库

数据库不能重复创建,如果重名则会出现以下情况







注意:
1,如果出现以下情况,则是**回调函数没有写返回值,**回调函数如果没有给返回值,则会返回随机值,但是callback函数要求成功必须返回0,系统要使用


2,从数据库查询出来的数据,统统是字符串类型
3,从数据库中查询数据,查到几条,回调函数就会被执行几次
提高sqlite数据插入效率------开启事务机制
所谓 "事务" 就是指一组 SQL 命令,这些命令要么一起执行,要么都不被执行。在 SQLite中,每调用一次 sqlite3_exec () 函数,就会隐式地开启了一个事务,如果插入一条数据,就调用该函数一次,事务就会被反复地开启、关闭,会增大 IO 量。如果在插入数据前显式开启事务,插入后再一起提交,则会大大提高 IO 效率,进而加快数据插入速度。
步骤
1,BEGIN,显式开启事务,后续操作进入 "待提交" 状态
2,执行SQL操作,所有操作暂存于内存,未真正写入磁盘
3,COMMIT,提交事务,将所有操作一次性写入磁盘,事务结束


测量时间


功能:获取当前时间(可以精确到微秒)
参数:
tv:当前的具体时间
在程序运行前和运行完毕后分别调用该函数,最后进行相减,便可得出运行时间