days34:零基础学嵌入式之数据存储——数据库
一、数据存储
1.数据库文件与普通文件区别:
(1)普通文件对数据管理(增删改查)效率低
(2)数据库对数据管理效率高,使用方便
2.常用数据库:
(1)关系型数据库:
将复杂的数据结构简化为二维表格形式
大型:Oracle、DB2(IMB)
中型:MySql(嵌入式、python)、SQLServer(微软,仅用于windows)
小型:Sqlite(多用于物联网,跨移植能力好、支持c的都可数据存储);
(2)非关系型数据库:
以键值对存储,且结构不固定 //JSON、Redis、MongoDB
3.嵌入式数据库:sqlite3:
stu.db
(1)开源免费, c语言开发;
(2)代码量少,1万行左右,总大小10M以内;
(3)文件型数据库,可以移动;
(4)数据容量最大2T(理论情况下);
二、数据库sqlite3(不区分大小写)
SQLite 教程 | 菜鸟教程
1.sqlite命令:
(1).help
查看sqlite3支持的相关命令
(2).quit
退出sqlite3数据库
(3).tables
查看数据库中的所有表
(4).schema tablename
查看tablename创建时的SQL语句(表的结构)
(5).headers on/off
开启关闭列名称
(6).mode column
以左对齐列宽显示数据
(7).width 第一列宽度 第二列宽度 第三列宽度 ...
设置column模式显示下的每列的宽度
2.sqlite3存储类型
- 还有其他亲和类型,查询上面网站具体查询
3.SQL语言:“增删改查”
(1)create table :创建表
create table 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....);
表不存在,则创建,存在不创建
create table if not exists 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....);
(2)insert into :插入表
INSERT INTO 表名称 VALUES(值1, 值2,....)
(3)select 查表
SELECT * FROM 表名称【查全部的】
SELECT 列名称 FROM 表名称【查列的】
SELECT 列名称1,列名称2,列名称3 FROM 表名称【查好几列】
(4)where:
1)条件匹配
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
运算符: “ >“ 、 ”=“ 、 ”<“ 、 ” !=“ 、 ”and”(&&) 、 “ or”(||)......
2)模糊查询
SELECT * FROM 表名称 WHERE 列名 like '%冬梅';
SELECT * FROM 表名称 WHERE 列名 like '马%';
SELECT * FROM 表名称 WHERE 列名 like '马__';
百分号(%)代表零个、一个或多个数字或字符。
下划线(_)代表一个单一的数字或字符。这些符号可以被组合使用。
3)顺序显示
selete * form 表名称 order by 列名 ASC; //升序查询
selete * form 表名称 order by 列名 DESC; //降序查询
select * from class1 order by score ASC; 升序查询
select * from class1 order by score DESC;降序查询
(5)delete
删除表中信息
DELETE FROM 表名称 +条件;
DELETE FROM 表名称 WHERE 列名称 = 值
(6)update
改表中信息
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值;
(7)datetime
datetime('now', '+8 hours');
select datetime('now', '+8 hours');
查询当前东八区时间
(8)删除整个表
drop table 表名;
(9)设置主键值自动增长列
create table 表名称(id INTEGER PRIMARY KEY AUTOINCREMENT, 类名称 数据类型, ...);
insert into 表名称 values(NULL,“zhangsan”,类名称 数据类型, .......);
- 必须是sqlite3的数据类型,不可是亲和型,也不可是字符型;
- 后期插入的时候,整个主键值自动增长列为NULL;
4.sqlist3提供的C的接口
(1)1.sqlite3_open ===》XXX.db文件
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
功能:
打开一个数据库文件获得操作数据库文件的句柄
如果数据库存在,则打开;不存在,则创建
参数:
filename:数据库文件路径
ppDb:存放句柄指针空间的首地址
返回值:
成功返回SQLITE_OK
(2)sqlite3_exec
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 */
);
1)功能:
在数据库中执行SQL语句
2)参数:
sqlite3*:数据库句柄
sql :SQL语句字符串首地址
callback:回调函数(只有select时使用)
void * :回调函数的传参(只有select时使用)
char **errmsg:出错信息存放空间首地址
3)返回值:
成功返回SQLITE_OK 0
4)回调函数类型:
int fun(void* arg,int n_column,char** column_value,char** column_name);
参数:
arg : sqlite3_exec传递的第四个参数
n_column :查询到数据的列数,查了几列
column_value:查询结果每个字段的首地址集合;保存查询到的每行的每列的数据的指针数组;
column_name :查询结果每个字段的字段名称首地址集合;查询道德每列名字的指针数组;
注意:
1. select查询几行数据,回调函数就执行几次;
2.回调函数必须要返回0,否则sqlite3_exec调用失败
3.数据库中查出的数据均为字符串
错误原因,回调函数没有给返回值;
二级指针用法:
1.被调函数中,修改主调函数的指针变量;
&p ——》cha**;
2.指针数组作为参数传递的时候:数组里面保存了多个指针
char *a[5] :数组 ====》char **;