嵌入式数据库-Sqlite3

阅读引言: 本文将会从环境sqlite3的安装、数据库的基础知识、sqlite3命令、以及sqlite的sql语句最后还有一个完整的代码实例, 相信仔细学习完这篇内容之后大家一定能有所收获。

目录

一、数据库的基础知识

1.数据库的基本概念

2.常用数据库

3.嵌入式数据库

4.sqlite3基础

5.创建数据库

6.数据库的相关术语

二.Sqlite3安装

三、Sqlite3命令

四、Sqlite3语句

五、Sqlite编程接口

六、代码实例

七、简单总结


一、数据库的基础知识

1.数据库的基本概念

数据(Data):能够输入计算机并能被计算机程序识别和处理的信息集合

数据库 (Database):数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合

2.常用数据库

大型数据库:

Oracle公司是最早开发关系数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率名列前茅。

IBM 的DB2是第一个具备网上功能的多媒体关系数据库管理系统,支持包Linux在内的一系列平台。

中型数据库:

Server是微软开发的数据库产品,主要支持windows平台。

小型数据库:

mySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司,2008年被Sun公司收购,开放源码。

3.嵌入式数据库

基于嵌入式Linux的数据库主要有SQLite, Firebird, Berkeley DB, eXtremeDBFirebird是关系型数据库,功能强大,支持存储过程、SQL兼容等SQLite关系型数据库,体积小,支持ACID事务

Berkeley DB中并没有数据库服务器的概念,它的程序库直接链接到应用程序中eXtremeDB是内存数据库,运行效率高

4.sqlite3基础

SQLite的源代码是C,其源代码完全开放。SQLite第一个Alpha版本诞生于2000年5月。 他是一个轻量级的嵌入式数据库。

SQLite有以下特性:

  • 零配置无需安装和管理配置;
  • 储存在单一磁盘文件中的一个完整的数据库;
  • 数据库文件可以在不同字节顺序的机器间自由共享;
  • 支持数据库大小至2TB;
  • 足够小,全部源码大致3万行c代码,250KB;
  • 比目前流行的大多数数据库对数据的操作要快;

5.创建数据库

手工创建:

使用SQLite3工具,通过手工输入SQL命令行完成数据库创建,用户在Linux的命令行界面中输入SQLite3可启动SQLite3工具

代码创建:

在代码中常动态创建数据库,在程序运行过程中,当需要进行数据库操作时,应用程序会首先尝试打开数据库,此时如果数据库并不存在,程序则会自动建立数据库,然后再打开数据库

6.数据库的相关术语

数据库的相关术语有很多,以下是一些常见的数据库术语:

1. 数据库(Database):数据的集合,按照一定的数据模型组织和存储的集合。

2. 表(Table):用于存储数据的二维数据结构,由行(Record)和列(Field)组成。

3. 行(Record):表中的一条数据,也被称为记录或元组。

4. 列(Field):表中的一个属性,也被称为字段或列名。

5. 主键(Primary Key):表中用于唯一标识每条记录的字段或字段组合。

6. 外键(Foreign Key):表中用于建立与其他表之间关联关系的字段。

7. 索引(Index):加速数据检索的数据结构,通过对关键字段建立索引,可以快速定位数据。

8. 查询(Query):从数据库中检索数据的操作,通过使用SQL语言编写查询语句来实现。 9. SQL(Structured Query Language):结构化查询语言,用于管理和操作关系型数据库的标准语言。

10. 视图(View):虚拟表,基于一个或多个表的查询结果创建的,可以简化复杂的查询操作。

11. 触发器(Trigger):与表相关联的特殊类型的存储过程,在插入、更新或删除数据时自动触发执行。

12. 事务(Transaction):一组数据库操作,要么全部执行成功,要么全部回滚,保证数据的一致性和完整性。

13. 归范式(Normalization):为了避免数据冗余和不一致,对数据模型进行优化的过程。常见的归范式有第一范式(1NF)、第二范式(2NF)和第三范式(3NF)等。

14. 关系数据库管理系统(RDBMS):用于存储、管理和操作关系型数据库的软件系统,例如MySQL、Oracle、SQL Server等。 这些术语是数据库领域中常用的,理解这些术语可以帮助你更好地了解和使用数据库。

15.数据库管理者(database administrator)

二.Sqlite3安装

sudo apt-get install

dpkg -s sqlite3

按道理来讲, 到这一步就结束了, 但是在实际的代码编译中, 找不到sqlite3.h头文件, 也链接不到对应的sql接口的实现。大家安装完可以先去/usr/include目录下看有没有对应的头文件, 没有的话这样干。安装sqlite3的库包。

sudo apt-get install libsqlite3-dev

三、Sqlite3命令

注意都以'.'开头

         .exit 退出

         .quit 退出

         .table   查看表

         .schema  查看表的结构

        .open databasename 打开数据库

        .help 命令帮助

简单演示

四、Sqlite3语句

        1-- 创建一张表

            create table stuinfo(id integer, name text, age integer, score float);

         

        2-- 插入一条记录

            insert into stuinfo values(1001, 'zhangsan', 18, 80);

            insert into stuinfo (id, name, score) values(1002, 'lisi', 90);

        3-- 查看数据库记录

            select * from stuinfo;

            select * from stuinfo where score = 80;

            select * from stuinfo where score = 80 and name= 'zhangsan';

            select * from stuinfo where score = 80 or name='wangwu';

            select name,score from stuinfo;  查询指定的字段

            select * from stuinfo where score >= 85 and score < 90;

        4-- 删除一条记录

            delete from stuinfo where id=1003 and name='zhangsan';

        5-- 更新一条记录

            update stuinfo set age=20 where id=1003;

            update stuinfo set age=30, score = 82 where id=1003;

        6-- 删除一张表

            drop table stuinfo;

        7-- 增加一列

            alter table stuinfo add column sex char;

        8-- 删除一列

            create table stu as select id, name, score from stuinfo;    复制除了要删除的那一列,

            drop table stuinfo;   //删除原来的表

            alter table stu rename to stuinfo;    //把新建的表改为原来的表名

      设置主键并且该主键是自增的, 主键的意思就是唯一的意思, 比如一张表中的id号, 身份证号啥的。

     create table info(id integer primary key autoincrement, name vchar);


简单演示

五、Sqlite编程接口

  • int   sqlite3_open(char  *path,   sqlite3 **db)
    • 功能:打开sqlite数据库
    • path:数据库文件路径
    • db:指向sqlite句柄的指针
    • 返回值:成功返回0,失败返回错误码(非零值)
  • int   sqlite3_close(sqlite3 *db);
    • 功能:关闭sqlite数据库        
    • 返回值:成功返回0,失败返回错误码
  • const  char  *sqlite3_errmg(sqlite3 *db);        
    • 返回值:返回错误信息
  • Int sqlite3_exec(sqlite3 *db, const  char  *sql, sqlite3_callback callback, void *, char **errmsg);
    • 功能:执行SQL操作
    • db:数据库句柄
    • sqlSQL语句
    • callback:回调函数
    • errmsg:错误信息指针的地址
    • 返回值:成功返回0,失败返回错误码
  • typedef  int (*sqlite3_callback)(void *para, int f_num, char **f_value, char **f_name);
    • 功能:每找到一条记录自动执行一次回调函数
    • para:传递给回调函数的参数
    • f_num:记录中包含的字段数目
    • f_value:包含每个字段值的指针数组
    • f_name:包含每个字段名称的指针数组
    • 返回值:成功返回0,失败返回-1
  • 不使用回调函数执行SQL语句
  • int   sqlite3_get_table(sqlite3 *db, const  char  *sql,  char ***resultp,  int*nrow,  int *ncolumn, char **errmsg);
    • 功能:执行SQL操作
    • db:数据库句柄
    • sqlSQL语句
    • resultp:用来指向sql执行结果的指针
    • nrow:满足条件的记录的数目
    • ncolumn:每条记录包含的字段数目
    • errmsg:错误信息指针的地址
    • 返回值:成功返回0,失败返回错误码

六、代码实例

实例软件结构如下: 

Makefile

OBJ=$(wildcard ./*.c)
all:$(OBJ)gcc *.c -o test -lsqlite3

main.c

#include "sqlite_method.h"/* hint user input */
void hint_display();/* main */
int main(int argc, const char *argv[])
{sqlite3 *db;char *errmsg;char input;if(sqlite3_open(DATABASE_PATH, &db) != SQLITE_OK) {printf("%s\n", sqlite3_errmsg(db));return -1;} else {printf("open database [%s] success\n", DATABASE_PATH);}if(sqlite3_exec(db, "create table if not exists exercise(id integer, name text, score integer);", \NULL, NULL, &errmsg) != SQLITE_OK) {printf("sqlite3_exec failed, line: %d\n", __LINE__);}/* handle user input */while(1) {hint_display();	scanf("%c", &input);switch(input) {case 'i':insert_handle(db);getchar();break;case 'd':delete_handle(db);getchar();break;case 'q':query_handle(db);getchar();break;case 'u':update_handle(db);getchar();break;case '!':quit_handle(db);getchar();break;default:printf("invalid option!\n");}}return 0;
}void hint_display()
{printf("**********************************************************\n");printf("*i: insert   d: delete    q: query    u: update    !:exit*\n");printf("**********************************************************\n");
}

sqlite_method.h

#ifndef _SQLITE_METHOD_H_
#define _SQLITE_METHOD_H_/*Author: Hewei*Date: 2024-3-30*Brife: database operator* */#include <sqlite3.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>#define DATABASE_PATH "./exercise.db"
#define N 256void insert_handle(sqlite3 *db);
void delete_handle(sqlite3 *db);
void query_handle(sqlite3 *db);
void update_handle(sqlite3 *db);
void quit_handle(sqlite3 *db);#endif

sqlite_method.c

#include "sqlite_method.h"void insert_handle(sqlite3 *db)
{int id;char name[128] ={0};int score;char buff[N] = {0};char *errmsg;printf("Please input id:");scanf("%d", &id);printf("Please input name:");scanf("%s", name);//getchar();          method 1printf("Please input score:");//scanf("% c%d", &score);       method 2scanf("%*c%d", &score);sprintf(buff, "insert into exercise values(%d, '%s', %d)", id, name, score);if(sqlite3_exec(db, buff, NULL, NULL, &errmsg) != SQLITE_OK) {printf("%s\n", errmsg);} else {printf("\n\n\n");printf("insert operator success!|\n");}}void delete_handle(sqlite3 *db)
{int id;char buff[N] = {0};char *errmsg;printf("Please input delete id:");scanf("%d", &id);snprintf(buff, sizeof(buff), "delete from exercise where id = %d", id);if(sqlite3_exec(db, buff, NULL, NULL, &errmsg) != SQLITE_OK) {printf("%s\n", errmsg);} else {printf("\n\n\n");printf("delete operator success!|\n");}}int query_callback(void *arg, int f_num, char **value, char **name) 
{int i;static int count = 0;if(count == 0) {for(i = 0; i < f_num; i++) {printf("%-10s", name[i]);	}count = 1;putchar(10);}for(i = 0; i < f_num; i++) {printf("%-10s", value[i]);}puts("");return 0;
}void query_handle(sqlite3 *db)
{	char buff[N] = {0};char *errmsg;sprintf(buff, "select * from exercise");if(sqlite3_exec(db, buff, query_callback, NULL, &errmsg) != SQLITE_OK) {printf("%s\n", errmsg);} else {printf("\n\n\n");printf("query operator success!|\n");}}void update_handle(sqlite3 *db)
{char buff[128];char *errmsg;int id, score;printf("Please input you want update id:");scanf("%d", &id);printf("Please input you want update score:");scanf("%d", &score);sprintf(buff, "update exercise set score = %d where id = %d\n", score, id);if(sqlite3_exec(db, buff, NULL, NULL, &errmsg) != SQLITE_OK) {printf("%s\n", errmsg);} else {printf("\n\n\n");printf("update operator success!\n");}
}void quit_handle(sqlite3 *db)
{printf("\n\n\n");printf("database os exit success!\n");sqlite3_close(db);exit(1);
}

七、简单总结

1. 关系型数据库其实就是execl那种类似的表格, 不是什么高深的东西

2. Sqlite3的特点: 体积小、简单、高效、本地存储、源码开放。

好了, 老规矩希望对有需要的人有帮助。因为这个我实现得不是很规范,看不懂的地方随时欢迎私信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/291862.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wordpress插件,免费的wordpress插件

WordPress作为世界上最受欢迎的内容管理系统之一&#xff0c;拥有庞大的插件生态系统&#xff0c;为用户提供了丰富的功能扩展。在内容创作和SEO优化方面&#xff0c;有一类特殊的插件是自动生成原创文章并自动发布到WordPress站点的工具。这些插件能够帮助用户节省时间和精力&…

Hides for Mac:应用程序隐藏工具

Hides for Mac是一款功能强大的应用程序隐藏工具&#xff0c;专为Mac用户设计。它能够帮助用户快速隐藏当前正在运行的应用程序窗口&#xff0c;保护用户的隐私和工作内容&#xff0c;避免不必要的干扰。 软件下载&#xff1a;Hides for Mac下载 Hides for Mac的使用非常简单直…

初步了解C++

目录 一&#xff1a;什么是C&#xff1f; 二.C发展史 三:C关键字 四&#xff1a;命名空间 4.1命名空间的介绍 4.2命名空间的使用 4.3命名空间的使用 4.3.1使用作用域限定符 4.3.2 使用using将命名空间的某个成员引入 4.3.3使用using把整个命名空间展开 4.4命名空…

BaseDao封装增删改查

文章目录 什么是BaseDao操作代码增删改查询单个数据查询多个数据 总结 什么是BaseDao BaseDao是&#xff1a; 数据库里负责增加&#xff0c;删除&#xff0c;修改&#xff0c;查询 具体来说是一种接口代码,公共方法的接口类。 在dao层新建basedao,其他dao层接口继承basedao 相…

BC40056 Imports“SolidWorks.Interop.swconst”中指定的命名空间或类型不包含任何公共成员

BC40056 Imports“SolidWorks.Interop.swconst”中指定的命名空间或类型不包含任何公共成员&#xff0c;或者找不到该命名空间或类型。 问题描述原因分析 解决办法 ) 问题描述 严重性 代码 说明 项目 文件 行 警告 BC40056 Imports“SolidWorks.Interop.swconst”中指定的命名…

基于SSM框架的校园失物招领系统:从设计思路到实现细节

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

Java代码基础算法练习-自定义函数之字符串连接-2024.03.30

任务描述&#xff1a; 写一函数&#xff0c;将两个字符串连接起来&#xff0c;然后在主函数中调用该函数实现字符串连接操作。 任务要求&#xff1a; 代码示例&#xff1a; package M0317_0331;import java.util.Scanner;public class m240330 {public static void main(Stri…

Python 妙用运算符重载——玩出“点”花样来

目录 运算符重载 主角点类 魔法方法 __getitem__ __setitem__ __iter__ __next__ __len__ __neg__ __pos__ __abs__ __bool__ __call__ 重载运算符 比较运算符 相等 不等 ! 大于和小于 >、< 大于等于和小于等于 >、< 位运算符 位与 & 位…

腾讯 tengine 替代 nginx

下载地址 变更列表 - The Tengine Web Server 解压 tar -xvf 安装包.gz 进入到解压目录 cd 解压目录 使用 ./configure 命令来指定安装目录,这边指定安装到 /opt/tengine/install路径下 新建install目录 ./configure --prefix/opt/tengine/install 检查是否有缺失的依…

LM算法探寻——答案在022浙江大学信号与系统

LM算法详解 | 宇尘 (gitee.io) 求函数最小值&#xff0c;从另一个角度理解是求误差最小值。 梯度 最陡梯度下降算法和LMS算法原理介绍及MATLAB实现_lms滤波器中的梯度下降-CSDN博客 均值即平均值 (3 封私信 / 56 条消息) FIR滤波器中的冲激响应怎么理解&#xff1f; 和滤波有…

嵌入式linux学习之交叉编译器安装

交叉编译器介绍 ARM 裸机、Uboot 移植、Linux 移植这些都需要在 Ubuntu 下进行编译&#xff0c;编译就需要编译器&#xff0c;在 Liux 进行 C 语言开发里面使用 GCC 编译器进行代码编译&#xff0c;但是 Ubuntu 自带的 gcc 编译器是针对 X86 架构的&#xff01;而我们现在要编…

Linux安装python3

Linux安装python3 本文章中使用的安装包等相关文件&#xff1a; 链接: https://pan.baidu.com/s/1C4PTB6IqXtHM6XSOEMkefg 提取码: wyeq 1.编译环境安装 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc mak…

在 Linux 中通过 SSH 执行远程命令时,无法自动加载环境变量(已解决)

问题场景 目前我的环境变量都存储在 /etc/profile 文件中&#xff0c;当我通过远程 SSH 执行一些命令时&#xff0c;提示命令找不到&#xff0c;如下所示&#xff1a; 问题出现原因 这里找到了一张出自尚硅谷的图片&#xff0c;很好的解释了该问题&#xff1a; 这是由于 Linu…

03---java面试八股文——mybatis-------8题

21、MyBatis实现一对一查询 MyBatis 有两种不同的方式加载关联&#xff1a; 嵌套 Select 查询&#xff1a;通过执行另外一个 SQL 映射语句来加载期望的复杂类型。嵌套结果映射&#xff1a;使用嵌套的结果映射来处理连接结果的重复子集。查看mybatis的关联 MyBatis是一种流行的J…

乡村数字化转型:科技赋能打造智慧农村新生态

随着信息技术的迅猛发展&#xff0c;数字化转型已成为推动社会进步的重要引擎。在乡村振兴的大背景下&#xff0c;乡村数字化转型不仅是提升乡村治理能力和治理水平现代化的关键&#xff0c;更是推动农业现代化、农村繁荣和农民增收的重要途径。本文旨在探讨乡村数字化转型的内…

瑞吉外卖实战学习--5、新增员工功能

新增员工功能 效果图1、开发流程2、页面发送ajax请求,将新增员工的信息以json的形式提交给服务器2.1、在填写信息的时候会发现身份校验比较麻烦,可以在validate中将全局的校验方式去掉,方便填写2.3、看到接口未employee2.4、前端代码分析3、服务器接收到提交的数据并调用ser…

(js)循环条件满足时终止循环

(js)循环条件满足时终止循环 功能需求&#xff1a;勾选的字段中若包含“数据标注划分”则显示数据划分&#xff0c;不包含则不显示 包含&#xff1a; 不包含&#xff1a; // 标注划分显示 const markStr 数据标注划分 for (let i 0; i < value.length; i) { //value为勾选…

大话设计模式之策略模式

策略模式是一种行为设计模式&#xff0c;它允许在运行时选择算法的行为。这种模式定义了一族算法&#xff0c;将每个算法都封装起来&#xff0c;并且使它们之间可以互相替换。 在策略模式中&#xff0c;一个类的行为或其算法可以在运行时改变。这种模式包含以下角色&#xff1…

数字化时代多系统安全运维解决方案

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&…

基于springboot实现数据库的加解密

项目地址 https://github.com/Chenchicheng/spring-ibatis-encryption 功能说明 支持使用注解的方式目标类进行加解密支持同一个类多个字段分别使用不同的加密方式支持自定义加密方法 本地调试 pull代码到本地&#xff0c;更换application.yml中的数据库用户名和密码&…