SQLite3

数据库简介

常用的数据库

大型数据库:Oracle
中型数据库:Server 是微软开发的数据库产品,主要支持 windows 平台。
小型数据库:mySQL 是一个小型关系型数据库管理系统,开放源码 。(嵌入式不需要存储太多数据。)

SQLite 基础

SQLite 的源代码是 C,其源代码完全开放,是一个轻量级的嵌入式数据库。

特性:

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

创建 SQLite 数据库:

-----------------两种方式都会用得到,重点是代码创建--------------------

手工创建:

使用 sqlite3 工具,通过手工输入 SQL 命令行完成数据库创建。

代码创建:

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

Linux 虚拟机中 sqlite3 的安装

在线安装方式

1) 确保虚拟机能联网
2)
● sudo apt-get update
● sudo apt-get install sqlite3
● sudo apt-get install libsqlite3-dev
● sudo apt-get install sqlitebrowser
安装软件及开发环境
—>sqlite3 数据库软件
—>sqlite3 数据库开发支持库
—>sqlite3 数据库操作软件
3) 安装成功后,终端输入以下指令,判断是否安装成功:

sqlite3  my.db

出现下列语句,表示安装成功,版本不一样无所谓,只要出现“sqlite>”即可,输入“.quit”退出数据库:
在这里插入图片描述

基础 SQL语句 的使用

两种命令格式:

sqlite3 系统命令

—— 以“.”开头;

SQL 命令

—— 以“;”结尾。

API 接口

(👆 跳转至 SQLite 官网)常用接口见 “sqlite3 编程”。
在这里插入图片描述

sqlite3 的使用:

1、创建一个数据库(数据库为空时,找不到图标);
在这里插入图片描述

2、在新建的数据库中,创建一张表,并设置主键;(表格创建成功后,数据库的图标显现)
在这里插入图片描述

3、向新建的表中插入数据;
在这里插入图片描述
在这里插入图片描述

4、查询表格中的数据;
在这里插入图片描述

在这里插入图片描述

5、打开图形化数据库;
在这里插入图片描述

6、删除表中一行;
在这里插入图片描述

7、删除整张表;
在这里插入图片描述

8、删除数据库;
在这里插入图片描述

sqlite3 编程

(👆 跳转至 SQLite 官网)
在这里插入图片描述

sqlite3_open

#include<sqlite3.h>
int  sqlite3_open(char *path, sqlite3 **db);

功能:打开 sqlite 数据库(或新建数据库) 
参数:
	path:	数据库文件路径         
	db: 		指向数据库句柄的指针 - 该二级指针指向一级指针,最终会存储打开的数据库的首地址
返回值:成功返回0,失败返回错误码(非零值)	

使用: 	sqlite3 *db;
        if(sqlite3_open("stu.db", &db) != 0)
            fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
										// sqlite3 自带的打印错误信息	

值传递:   获取到值
地址传递: 修改值

sqlite3_close

#include<sqlite3.h>
int  sqlite3_close(sqlite3 *db);

功能:关闭 sqlite 数据库
参数:db
返回值:成功返回0,失败返回错误码

sqlite3_errmsg

#include<sqlite3.h>
const  char  *sqlite3_errmsg(sqlite3 *db);
功能:  打印错误信息
参数:db
返回值:返回错误信息
使用(e.g.):   fprintf(stderr, "sqlite3_open failed: %s\n", sqlite3_errmsg(db));

sqlite3_exec

原型:
    int sqlite3_exec(
        sqlite3 *db,                               		/* 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语句;
参数:
    sqlite3 *db:		指定要操作的数据库句柄指针;
    char *sql:			指定要执行的sql语句;
    int (*callback)(void*, int, char**, char**):回调函数; 
		该函数指针可以指向返回值是int类型,参数列表是(void*, int, char**, char**)的函数
    void *arg:			传递给回调函数的第一个参数;  
							- 类似线程函数传参,需强转 - 不传参可以填 NULL
    char **errmsg:	该二级指针指向的一级指针会存储错误信息的首地址,错误信息存储在静态存储区;
							(定义一个一级指针即可)                                   
返回值:
    成功:返回 SQLITE_OK,即 0;
	失败:返回 error_code,即非 0
// sqlite3.c

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

int num;
char buf[128] = {};
typedef struct{
    int id;
    char name[32];
    float score;
} STU; 

int main(int argc, char const *argv[])
{
    sqlite3 *db = NULL;
    if (sqlite3_open("/home/hq/MyFolders/sqlite3/testdb.db", &db)){
        fprintf(stderr, "Sqlite3_open failed: %s\n", sqlite3_errmsg(db));
        return -1;
    }

    char *errmsg = NULL;
    if (sqlite3_exec(db, "CREATE TABLE stu(id int primary key, name char, score float);",
                     NULL, NULL, &errmsg)){
        fprintf(stderr, "Failed to create a table named \"stu\": %s\n", errmsg);
        return -1;
    }

    if (sqlite3_exec(db, "INSERT INTO stu VALUES(2023052201, \"Frank\", 95);", 
                     NULL, NULL, &errmsg)){
        fprintf(stderr, "Failed to insert: %s\n", errmsg);
        return -1;
    }

    printf("Please input a number:\n");
    scanf("%d", &num);

    STU stu;
    for (int i = 0; i < num; i++){
        scanf("%d %s %f", &stu.id, stu.name, &stu.score);
        sprintf(buf, "INSERT INTO stu VALUES(%d, \"%s\", %f);", 
                stu.id, stu.name, stu.score);

        if (sqlite3_exec(db, buf, NULL, NULL, &errmsg)){
            fprintf(stderr, "Failed to insert: %s\n", errmsg);
            return -1;
        }
    }

    sqlite3_close(db);
    return 0;
}

运行结果如下:
在这里插入图片描述
在这里插入图片描述

sqlite3_exec 的 回调函数 callback

int callback(void *arg, int columns, char **column_text, char **column_name);

功能:sqlite3_exec 每找到一条满足条件的记录,就会执行一次回调函数。
参数:
		void *arg:		sqlite3_exec 的第四个参数传入;
		int columns:	查询结果的列数;
		char **column_text:该二级指针指向一个指针数组,
					数组中的元素都是 char*类型 的指针,指针指向查询结果的内容;
		char **column_name:该二级指针指向一个指针数组,
					数组中的元素都是 char*类型 的指针,指针指向查询结果的列名;
返回值:
    成功时候必须返回0,该返回值会返回给 sqlite3_exec 函数,
    如果没有返回0,则 sqlite3_exec 会认为回调函数运行失败,从而导致 sqlite3_exec 运行失败。 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

// sqlite3.c

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

int num;
char buf[128] = {};
typedef struct{
    int id;
    char name[32];
    float score;
} STU; 

int select_cback(void *arg, int columns, char **column_text, char **column_name){
    
    printf("columns: %d\n", columns);
    printf("column_name: ");
    for (int i = 0; i < columns; i++)
        printf("%-12s", column_name[i]); 
    putchar(10);
    printf("column_text: ");
    for (int i = 0; i < columns; i++)
        printf("%-12s", column_text[i]);
    putchar(10);

    return 0;
}

int main(int argc, char const *argv[])
{
    sqlite3 *db = NULL;
    if (sqlite3_open("/home/hq/MyFolders/sqlite3/testdb.db", &db)){
        fprintf(stderr, "Sqlite3_open failed: %s\n", sqlite3_errmsg(db));
        return -1;
    }

    char *errmsg = NULL;
    if (sqlite3_exec(db, "CREATE TABLE stu(id int primary key, name char, score float);",
                     	NULL, NULL, &errmsg)){
        fprintf(stderr, "Failed to create a table named \"stu\": %s\n", errmsg);
    }

    if (sqlite3_exec(db, "INSERT INTO stu VALUES(2023052201, \"Frank\", 95);", 
                     	NULL, NULL, &errmsg)){
        fprintf(stderr, "Failed to insert: %s\n", errmsg);
        return -1;
    }

    printf("Please input a number:\n");
    scanf("%d", &num);

    STU stu;
    for (int i = 0; i < num; i++){
        scanf("%d %s %f", &stu.id, stu.name, &stu.score);
        sprintf(buf, "INSERT INTO stu VALUES(%d, \"%s\", %f);", 
                			stu.id, stu.name, stu.score);

        if (sqlite3_exec(db, buf, NULL, NULL, &errmsg)){
            fprintf(stderr, "Failed to insert: %s\n", errmsg);
            return -1;
        }
    }

    if (sqlite3_exec(db, "SELECT * FROM stu;", select_cback, NULL, &errmsg)){
        fprintf(stderr, "Select failed: %s\n", errmsg);
        return -1;
    }

    printf("------------------------\n");
    if (sqlite3_exec(db, "SELECT name FROM stu WHERE score = 92;", 
                     select_cback, NULL, &errmsg)){
        fprintf(stderr, "Select failed: %s\n", errmsg);
        return -1;
    }

    sqlite3_close(db);
    return 0;
}

运行结果如下:
在这里插入图片描述

在这里插入图片描述

sqlite3_get_table(不回调查询)

int sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp, 
                      			int *nrow, int *ncolumn, char **errmsg);

功能:执行SQL操作
参数: 	db:			数据库句柄   
        sql:			SQL语句
        resultp:	用来指向sql执行结果的指针 
                        (该参数为三级指针,指向二级指针,所以需定义二级指针变量) 
    	nrow:		该一级指针指向的内存空间中存储结果的行数,(一级指针指向变量地址),包括表头
    	ncolumn:	该一级指针指向的内存空间中存储结果的列数 
        errmsg:	该二级指针指向的一级指针会存储错误信息首地址 
返回值:成功返回SQLITE_OK,失败返回错误码

在这里插入图片描述

// sqlite3.c

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

int num;
char buf[128] = {};
typedef struct{
    int id;
    char name[32];
    float score;
} STU; 

int main(int argc, char const *argv[])
{
    sqlite3 *db = NULL;
    if (sqlite3_open("/home/hq/MyFolders/sqlite3/testdb.db", &db)){
        fprintf(stderr, "Sqlite3_open failed: %s\n", sqlite3_errmsg(db));
        return -1;
    }

    char *errmsg = NULL;
    if (sqlite3_exec(db, "CREATE TABLE stu(id int primary key, name char, score float);",
                     	NULL, NULL, &errmsg)){
        fprintf(stderr, "Failed to create a table named \"stu\": %s\n", errmsg);
    }

    if (sqlite3_exec(db, "INSERT INTO stu VALUES(2023052201, \"Frank\", 95);", 
                     	NULL, NULL, &errmsg)){
        fprintf(stderr, "Failed to insert: %s\n", errmsg);
        return -1;
    }

    printf("Please input a number:\n");
    scanf("%d", &num);

    STU stu;
    for (int i = 0; i < num; i++){
        scanf("%d %s %f", &stu.id, stu.name, &stu.score);
        sprintf(buf, "INSERT INTO stu VALUES(%d, \"%s\", %f);", 
                		stu.id, stu.name, stu.score);

        if (sqlite3_exec(db, buf, NULL, NULL, &errmsg)){
            fprintf(stderr, "Failed to insert: %s\n", errmsg);
            return -1;
        }
    }

    char **resultp;
    int nrow, ncolumn;
    if (sqlite3_get_table(db, "SELECT * FROM stu;", &resultp, &nrow, &ncolumn, &errmsg)){
        fprintf(stderr, "Failed to select: %s\n", errmsg);
        return -1;
    }

    printf("--------------------\n");
    for (int i = 0; i <= nrow; i++){     			// 要包含表头
        for (int j = 0; j < ncolumn; j++)
            printf("%-12s", resultp[i*ncolumn+j]);
        putchar(10);
    }

    sqlite3_close(db);
    return 0;
}

运行结果如下:
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[Unity+OpenAI TTS] 集成openAI官方提供的语音合成服务,构建海王暖男数字人

1.简述 最近openAI官方发布了很多新功能&#xff0c;其中就包括了最新发布的TTS语音合成服务的api接口。说到这个语音合成接口&#xff0c;大家可能会比较陌生&#xff0c;但是说到chatgpt官方应用上的聊天机器人&#xff0c;那个台湾腔的海王暖男的声音&#xff0c;可能就有印…

C语言——结构体的应用

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 路还在继续&#xff0c;梦还在期…

【C++入门到精通】 Lambda表达式 C++11 [ C++入门 ]

阅读导航 引言一、C98中的一个例子二、Lambda表达式1. Lambda表达式语法&#xff08;1&#xff09;Lambda表达式各部分说明&#xff08;2&#xff09;捕获列表说明 三、Lambda表达式的底层原理温馨提示 引言 当今软件开发行业的快速发展和日益复杂的需求&#xff0c;要求程序员…

No matching variant of com.android.tools.build:gradle:7.4.2 was found.

一、报错信息 创建个新项目&#xff0c;运行直接报错&#xff0c;信息如下&#xff1a; No matching variant of com.android.tools.build:gradle:7.4.2 was found. The consumer was configured to find a runtime of a library compatible with Java 8, packaged as a jar,…

高防服务器的工作原理

在当今互联网时代&#xff0c;网络安全问题日益突出&#xff0c;各种网络攻击层出不穷。为了保护企业的网络安全&#xff0c;高防服务器应运而生。那么&#xff0c;你是否了解高防服务器的工作原理呢&#xff1f;下面就让我们一起来探索一下。 高防服务器是一种能够有效抵御各种…

DRF-项目-(1):构建纯净版的drf项目,不再使用django的后台管理,django的认证,django的session等功能,作为一个纯接口项目

项目的目录结构&#xff1a; -HeartFailure |-- apps |--user |--HeartFailure |-- static |--manage.py 一、django项目相关的 1、命令行中创建django项目 #1、切换到指定的虚拟环境中 workon my_drf#2、该虚拟环境已经安装好django和rest_framework了 django-admin startp…

Matlab进阶绘图第33期—双曲面图

在《Matlab论文插图绘制模板第56期—曲面图&#xff08;Surf&#xff09;》中&#xff0c;我分享过曲面图的绘制模板。 然而&#xff0c;有的时候&#xff0c;需要在一张图上绘制两个及以上的曲面图&#xff0c;且每个曲面图使用不同的配色方案。 在Matlab中&#xff0c;一张…

const修饰

const 起保护作用&#xff0c;禁止修改。 此时a变为常量&#xff0c;常量不可修改。 const放在*p的左端限制*p&#xff0c;即不能通过修改指针变量&#xff08;*p&#xff09;的值来修改p指向空间的内容&#xff0c;但p不受限制。 const放在*的右端限制p&#xff0c;即不能修…

【10套模拟】【8、9】

关键字&#xff1a; 建立有序单链表、多维数组是特殊线性结构、直接选择排序、哈夫曼树高度及wpl、中序最后叶子先序最后也是、堆是完全二叉树、分块查找 统计二叉树结点数、统计二叉树值和、奇偶数划分、判断链表是否递增

RPG项目_UI登录

首先创建一个项目 将资源包导进Resources文件夹 创建一个Scripts脚本文件夹 然后再对Scripts脚本文件夹分门别类 导入UI资源包 创建一个Image 按住Alt 选择右下角 image就会覆盖整个面板 修改image名字为BG 将image图片放置背景栏 再创建一个image 改名为MainMenu 修改MainMenu…

josef约瑟 电压继电器DJ-132 100~200V柜内板前接线,带附件

DJ-100系列电压继电器 DJ-111电压继电器&#xff1b; DJ-112电压继电器&#xff1b; DJ-121电压继电器&#xff1b; DJ-122电压继电器&#xff1b; DJ-131电压继电器&#xff1b; DJ-132电压继电器&#xff1b; DJ-131/60C电压继电器&#xff1b; DJ-131/60CN电压继电器…

【JavaEE初阶】认识线程、创建线程

1. 认识线程&#xff08;Thread&#xff09; 1.1 概念 1) 线程是什么 一个线程就是一个 "执行流". 每个线程之间都可以按照顺序执行自己的代码. 多个线程之间 "同时" 执行着多份代码. 举例&#xff1a; 还是回到我们之前的银⾏的例⼦中。之前我们主要描…

【libGDX】使用Mesh绘制矩形

1 前言 使用Mesh绘制三角形 中介绍了绘制三角形的方法&#xff0c;本文将介绍绘制正方形的方法。 libGDX 以点、线段、三角形为图元&#xff0c;没有提供绘制矩形内部的接口。要绘制矩形内部&#xff0c;必须通过三角形拼接而成&#xff0c;如下图&#xff0c;是通过GL_TRIANGL…

srs的webrtc信令分析

关于webrtc的流信令只有四个 /rtc/v1/publish/&#xff0c;这是推流接口&#xff0c;是推流客户端跟SRS交换SDP的接口 /rtc/v1/play/&#xff0c;这是拉流接口&#xff0c;是拉流客户端跟SRS交换SDP的接口 /rtc/v1/whip/&#xff0c;这也是推流接口&#xff0c;作用是也是交换…

Qt全球峰会2023中国站 参会概要

Qt全球峰会2023中国站 参会概要 前言峰会议程签到 & Demo 演示开场致辞Qt Group 产品总监演讲&#xff08;产品开发的趋势-开放的软件、工具和框架&#xff09;产品战略QtQuick or QtWidgets&#xff08;c or qml&#xff09;Qt如何定义AI个人看法 Qt 在券商数字化转型和信…

风电场叶片运输车模型-FBX格式-带动画-数字孪生场景搭建

FBX格式的风电场中叶片运输车辆模型&#xff0c;按照真实尺寸建模&#xff0c;车辆多个部位带动画效果&#xff0c;适用于风电场三维数字化场景和风电场数字孪生使用&#xff0c;也可以用来作为各种三维平台的测试模型。 模型效果图 下载地址 叶片运输车模型下载地址

专访|OpenTiny 开源社区 常浩:完成比完美更重要

前言 2023年已过大半&#xff0c;备受关注的 OpenTiny*开源之夏活动也顺利结项。开源之夏由中国科学院软件研究所发起的计划&#xff0c;目的在于鼓励在校学生积极参与开源软件的开发维护&#xff0c;推动优秀开源软件社区的繁荣发展。该活动联合各大开源社区&#xff0c;聚焦…

逸学java【初级菜鸟篇】9.4 泛型

hi&#xff0c;我是逸尘&#xff0c;一起学java吧 泛型概述 泛型是我们在定义某一个类型规格的时候使用的泛指&#xff0c;我们预先定义一个大方向&#xff0c;防止路线错误。 实质上是程序员定义的安全类型&#xff0c;Object是顶级父类&#xff0c;在没有泛型很多程序员为了…

Android 10.0 mtp模式下连接PC后只显示指定文件夹功能实现

1. 前言 在android10.0的系统定制化开发中,对于usb作为otg连接电脑时,在mtp模式下会作为一个存储器在电脑端显示,作为电脑的 一个盘符,来显示设备的内部存储的文件,所以说如果要对设备内部的资料做保密处理的时候,需要在mtp模式下不显示某些 文件夹,接下来就分析下相关…

【C语言】qsort函数

目录 简介 头文件 ​编辑 函数原型&#xff1a; 参数函数如何写&#xff1a; 参数函数要求&#xff1a; qsort对整性数据的排序&#xff1a; qsort对字符型数据的排序&#xff1a; 对结构体类型的内部元素排序&#xff1a; 函数的底层是以快速排序实现的 但是本文不深入…
最新文章