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

自学嵌入式 day36 数据库

一、数据库文件与普通文件区别:

    1.普通文件对数据管理(增删改查)效率低
2.数据库对数据管理效率高,使用方便

二、嵌入式数据库:

        1、sqlite3:
stu.db
1).开源免费, c语言开发
2).代码量少,1万行左右,总大小10M以内
3).文件型数据库,可以移动
4).数据容量最大2T

            2、sqlite3的安装
sudo apt-get install sqlite3
sudo apt-get install libsqlite3-dev

三、sqlite3 操作
        1、sqlite3相关命令

            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 SQL相关语句:

                1).create table :创建表
create table 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....);

注:(1)sqlite3数据类型:
INTEGER : int
REAL:double float
TEXT: char 字符串
NULL:值是一个 NULL值。
(2)表不存在,则创建,存在不创建
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 表名称

                ② 条件查找:SELECT 列名称 FROM 表名称 WHERE 列 <运算符> 值
③模糊查找:SELECT * FROM 表名称 WHERE 列名 like '%冬梅';

                注:%:可以匹配多个字符,_:只能通配一个字符

                ④有序查找:selete * form 表名称 order by 列名 ASC;  //升序查询
selete * form 表名称 order by 列名 DESC;  //降序查询

                4)delete: 删除表中信息
DELETE FROM 表名称 WHERE 列名称 = 值

                5)update:改表中信息 
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

                6)datetime:
datetime('now', '+8 hours');
select datetime('now', '+8 hours');//查询当前东八区时间

                7)设置主键值自动增长列
create table 表名称(id INTEGER PRIMARY KEY AUTOINCREMENT, 类名称 数据类型, ...);

                8)drop table 表名称
删除一张表

        注:1)安装可视化工具:sudo apt-get install sqlitebrowser
2)打开工具:sqlitebrowser xxx.db

        3、sqlite3提供的c接口

                1)1.sqlite3_open:int sqlite3_open(
const char *filename,   /* Database filename (UTF-8) */
sqlite3 **ppDb          /* OUT: SQLite db handle */
);
功能:打开一个数据库文件获得操作数据库文件的句柄
如果数据库存在,则打开;不存在,则创建
参数:filename:数据库文件路径 
ppDb:存放句柄指针空间的首地址
返回值:成功返回SQLITE_OK

                2).sqlite3_errmsg:const char *sqlite3_errmsg(sqlite3*);
功能:获得出错原因

                3).sqlite3_close: int sqlite3_close(sqlite3* pdb);
功能:关闭数据库句柄,释放空间

4)sqlite3_exec
int sqlite3_exec( sqlite3* pDb,const char *sql,int (*callback)(void*,int,char**,char**), void *arg, char **errmsg);
功能:
在数据库中执行SQL语句
参数:
sqlite3*:数据库句柄 
sql     :SQL语句字符串首地址
callback:回调函数(只有select时使用)
void *  :回调函数的传参(只有select时使用)
char **errmsg:出错信息存放空间首地址
返回值:
成功返回SQLITE_OK 0

        5)回调函数类型:
int fun(void* para,int n_column,char** column_value,char** column_name);
参数:
para         : sqlite3_exec传递的第四个参数
n_column    :查询到数据的列数
column_value:查询结果每个字段的首地址集合
column_name :查询结果每个字段的字段名称首地址集合

注意: 
1. 回调函数查询到几行数据就执行几次;
2.回调函数必须要返回0,否则sqlite3_exec调用失败
3.数据库中查出的数据均为字符串

        6)sqlite3_free
void sqlite3_free(void*);
功能:释放保存出错信息的空间

①创建打开数据库,创建表并添加元素

#include<stdio.h>
#include<sqlite3.h>

void *sqlite3_insert(sqlite3 *pdb,char *name,int score)
{
char buf[1024] = {0};
sprintf(buf,"insert into class3 values(NULL,\"%s\",%d)",name,score);
char *psql = buf;
int ret = sqlite3_exec(pdb,psql,NULL,NULL,NULL);
if(ret != SQLITE_OK)
{
fprintf(stderr,"sqlite3_exec fail:%s\n",sqlite3_errmsg(pdb));
sqlite3_close(pdb);
return NULL;
}

}

int main()
{
sqlite3 *pdb;
int ret = sqlite3_open("./stu.db",&pdb);
if(ret != SQLITE_OK)
{
fprintf(stderr,"sqlite3_open fail:%s\n",sqlite3_errmsg(pdb));
return -1;
}

    char *psql = "create table if not exists class3(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,score REAL)";
ret = sqlite3_exec(pdb,psql,NULL,NULL,NULL);
if(ret != SQLITE_OK)
{
fprintf(stderr,"sqlite3_exec fail:%s\n",sqlite3_errmsg(pdb));
sqlite3_close(pdb);
return -1;
}
printf("请输入添加的人名:");
char *name;
int score = 0;
scanf("%s",name);
printf("请输入添加的人名的成绩:");
scanf("%d",&score);
sqlite3_insert(pdb,name,score);
sqlite3_close(pdb);
return 0;
}

②打印查找的数据

#include<stdio.h>
#include<sqlite3.h>

int falg = 0;
int callback(void* arg,int cnt,char **values,char** name)
{
if(falg == 0)
{
printf("cnt = %d\n",cnt);
for(int i = 0;i < cnt;++i)
{
printf("%s ",name[i]);
}
printf("\n");
falg = 1;
}
for(int i = 0;i < cnt;++i)
{
printf("%s ",values[i]);
}
printf("\n");
return 0;

}
int main()
{
sqlite3 *pdb;
int ret = sqlite3_open("./stu.db",&pdb);
if(ret != SQLITE_OK)
{
fprintf(stderr,"sqlite3_open fail:%s\n",sqlite3_errmsg(pdb));
return -1;
}
char *p = "select * from class3";
ret = sqlite3_exec(pdb,p,callback,NULL,NULL);
if(ret != SQLITE_OK)
{
fprintf(stderr,"sqlite3_exec fail:%s\n",sqlite3_errmsg(pdb));
sqlite3_close(pdb);
return -1;
}
sqlite3_close(pdb);
return 0;
}

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

相关文章:

  • 前段面试题新版
  • 【华为机试】5. 最长回文子串
  • 数据结构——图(二、图的存储和基本操作)
  • 数据结构 | 队列:从概念到实战
  • Rust 最短路径、Tide、Partial、Yew、Leptos、数独实践案例
  • Nginx HTTP 反向代理负载均衡实验
  • Docker笔记(基本命令、挂载本地gpu、Dockerfile文件配置、数据挂载、docker换源)
  • Ettus USRP X410/X440 运行 ADC 自校准
  • easyexcel填充方式导出-合并单元格并设置边框
  • 解构远程智能系统的视频能力链:从RTSP|RTMP协议接入到Unity3D头显呈现全流程指南
  • MVSNet系列网络概述
  • 把振动数据转成音频并播放
  • C++模板初阶
  • C++模板进阶:从基础到实战的深度探索
  • 短剧小程序系统开发:连接创作者与用户的桥梁
  • vue3【组件封装】超级表单 S-form.vue
  • django ManyToManyField 如何添加数据
  • 多光谱相机助力第四次全国农业普查-农业用地调查
  • JAVA后端开发——“全量同步”和“增量同步”
  • 基于百度 iframe 框架与语音解析服务的数字人交互系统实现
  • Docker搭建Hadoop集群
  • Apache Ignite 的 JDBC Client Driver(JDBC 客户端驱动)
  • 基于电动自行车控制器设计方案
  • PyTorch中flatten()函数详解以及与view()和 reshape()的对比和实战代码示例
  • dapp前端⾯试题
  • 【QT搭建opencv环境】
  • <RT1176系列11>DMAMUX解读
  • Spring AI 1.0 提供简单的 AI 系统和服务
  • TS面试题
  • 分布式IO详解:2025年分布式无线远程IO采集控制方案选型指南