SQLite数据库使用指南以及相关API编程

news2024/11/24 22:32:42

SQLite介绍

  • SQLite是一种基于C语言开发的轻量级、快速、自包含、高可靠性和全功能的SQL数据库引擎。它是全球范围内使用最为广泛的数据库引擎,被嵌入到所有移动设备和大部分计算机中,并且伴随着无数日常使用的应用程序一起提供。
  • SQLite的文件格式具有稳定性、跨平台性以及向后兼容性,开发者承诺将持续保持这种特性至少到2050年。因其特点,SQLite数据库文件常被用作不同系统间交换丰富内容的容器,并作为一种长期数据归档格式。目前,全球有超过1万亿(1e12)个SQLite数据库处于活跃使用状态。

SQLite相关链接

  • SQLite主页
  • SQLite下载页
  • SQLite github地址

SQLite压缩包介绍及使用

  • 进入到SQLite下载页后,可以看到有很多压缩包。下面简单介绍下这些不同压缩包有什么区别。
    在这里插入图片描述
  • Source Code -> sqlite-amalgamation-3450200.zip
    • 是 SQLite 数据库引擎提供的一个打包形式,它包含了编译 SQLite 库所需的所有 C 源代码文件的合并版本。这个包是为了简化 SQLite 的分发和集成到其他项目中而设计的。
    • 如果想在自己代码中集成SQLite数据库,下载这个包并包含其头文件和源文件即可。
  • Source Code -> sqlite-autoconf-3450200.tar.gz
    • SQLite 的另一种打包形式,它是为方便在类 Unix 系统(如 Linux、BSD、Mac OS X 等)上通过自动配置工具 autoconf 和 make 进行编译和安装而准备的。这个包通常包含了 SQLite 源代码以及用于生成可移植配置脚本(configure)的一系列辅助文件。
    • 这个包主要在Linux系统使用,如果不想集成SQLite源代码,而是集成SQLite的动态库,可以下载这个包在Linux系统上编译。
    • 这个包下载解压后,分别执行以下命令编译安装
    •   ./configure --prefix=${pwd}/_install
        make
        make install
      
    • 执行完成后,在当前目录的_install目录下就会生成对应的头文件,库文件和可执行程序。
  • Documentation -> sqlite-doc-3450200.zip
    • SQLite的一些说明文档
  • Precompiled Binaries for Linux -> sqlite-tools-linux-x64-3450200.zip
    • 这个包是Linux平台X86架构的可执行程序,如果不需要将SQLite集成到代码中,可以直接下载这个包,在命令行执行SQL命令去操作数据库。
  • Precompiled Binaries for Windows -> sqlite-dll-win-x86-3450200.zip
    • 提供的Windows平台32位动态库
    • 这个包里只有动态库,我们需要借助Visual Studio生成一下静态库,如果安装的是Visual Studio 2015,找到 Microsoft Visual Studio 14.0\VC\bin\lib.exe这个程序,在cmd命令行执行以下命令
    •   "D:\Microsoft Visual Studio 14.0\VC\bin\lib.exe" /def:sqlite3.def /machine:ix86
      
    • 执行成功后,就会生成静态库文件。
  • Precompiled Binaries for Windows -> sqlite-dll-win-x64-3450200.zip
    • 提供的Windows平台64位动态库,如何生成静态库参考上面。
  • Precompiled Binaries for Windows -> sqlite-tools-win-x64-3450200.zip
    • Windows平台可执行程序
    • 如果不想集成SQLite,可以直接下载这个包,在命令行运行程序执行SQL语句操作数据库。
  • Alternative Source Code Formats -> sqlite-src-3450200.zip
    • 这个包未经过预处理的SQLite源代码,它包含完整的源文件树结构,包括所有的C语言源码文件、头文件、Makefile以及其他支持文件。
  • 总结
    • 如果只需要通过命令行,执行SQL语句操作数据库,Linux平台下载这个包 sqlite-tools-linux-x64-3450200.zip,Windows平台下载 sqlite-tools-win-x64-3450200.zip
    • 如果需要把SQLite以代码形式集成到我们的代码工程中,通过SQLite提供的API操作数据库。Windows和类Unix平台都可以直接使用这个包 sqlite-amalgamation-3450200.zip
    • 如果需要把SQLite以库形式集成到我们的代码工程中,类Unix平台下载这个包sqlite-autoconf-3450200.tar.gz去编译,Windows平台下载 sqlite-dll-win-x86-3450200.zip

命令行使用

  • 启动SQLite
    • 直接运行sqlite可执行程序,以Windows为例
      在这里插入图片描述
    • 运行成功后,就进入了数据库,接下来可以执行SQL语句来操作
  • 创建或打开数据库
    • 执行以下命令,就会打开或者一个数据库
    •   .open student.db
      
  • 创建表
    •   CREATE TABLE STUDENT(ID INT PRIMARY KEY NOT NULL, NAME CHAR(128), SCORE INT);
      
  • 插入数据
    •   INSERT INTO STUDENT(ID,NAME,SCORE) VALUES (1001, 'JACK', 98);
        INSERT INTO STUDENT(ID,NAME,SCORE) VALUES (1002, 'MARY', 96);
        INSERT INTO STUDENT(ID,NAME,SCORE) VALUES (1003, 'TOM', 96);
      
  • 查询数据
    •   SELECT * FROM STUDENT;
      
      在这里插入图片描述
    • 可以看到表中就有了我们插入的数据。
  • 命令行的使用就不过多介绍,主要是SQL语句的使用。

SQLite API介绍

  • SQLite API编程常用的接口有以下几个
  • sqlite3_open
    •   int sqlite3_open(const char *zFilename, sqlite3 **ppDb)
      
    • 函数功能:打开一个指向 SQLite 数据库文件的连接
    • 参数
      • zFilename:数据库名
      • ppDb : 数据库句柄
    • 返回值:成功返回 SQLITE_OK
  • sqlite3_exec
    •   int sqlite3_exec(sqlite3 *ppDb,  const char *sql,  int (*callback)(void*, int, char**,char**),  void *data,  char **errmsg)
      
    • 函数功能:执行SQL语句,异步接口。
    • 参数
      • ppDb:打开的数据库句柄
      • sql:需要执行的SQL语句
      • callback:回调函数,主要用于查询数据时,在该回调函数中获取数据
        • 参数1:回调函数可通过这个参数把数据传到外部
        • 参数2:查询的数据库表数据一共有多少行
        • 参数3:数据字段名
        • 数据4:数据值
      • data: 传递给回调函数的参数
      • errmsg:执行SQL语句出错时的错误信息
    • 返回值:成功返回 SQLITE_OK
  • sqlite3_get_table
    •   int sqlite3_get_table(sqlite3 *ppDb, const char *sql, char ***pazResult, int *pnRow, int *pnColumn, char **errmsg)
      
    • 函数功能:执行SQL语句,同步接口。
    • 参数
      • ppDb:数据库句柄
      • sql:需要执行的SQL语句
      • pazResult:输出参数,用于存储查询结果的二维字符数组指针
      • pnRow:输出参数,用于接收查询结果的行数
      • pnColumn:输出参数,用于接收查询结果的列数
      • errmsg:执行SQL语句出错时的错误信息
    • 返回值:成功返回 SQLITE_OK
  • sqlite3_close
    •   int sqlite3_close(sqlite3 *db);
      
    • 函数功能:关闭数据库

编程示例

  •   #include <stdio.h>
      #include "sqlite3.h"
      
      int callback(void* para, int columenCount, char** columnValue, char** columnName) {
      	char *stData = (char*)para;
      	// 获取的数据可以在这里保存和处理,也可以通过保存到 para 参数中,在外部保存处理
      	for (int i = 0; i < columenCount; i++) {
      		printf("%s\t%s\n", columnName[i], columnValue[i]);
      	}
      	strcpy(stData, "this is callback");
      	return 0;
      }
      
      int main(){
      	sqlite3 *db = NULL;
      	char *zErrMsg = NULL;
      	char sql[1024] = { 0 };
      
      	// 打开数据库
      	int rc = sqlite3_open("student.db", &db);
      	if (rc != SQLITE_OK) {
      		printf("open sqlite failed, errMsg: %s.", sqlite3_errmsg(db));
      		return -1;
      	}
      
      	// 创建表
      	strcpy(sql, "CREATE TABLE STUDENT(ID INT PRIMARY KEY NOT NULL, NAME CHAR(128), SCORE INT);");
      	rc = sqlite3_exec(db, sql, callback, NULL, &zErrMsg);
      	if (rc != SQLITE_OK) {
      		printf("create table failed, errMsg: %s", zErrMsg);
      		sqlite3_free(zErrMsg);
      		sqlite3_close(db);
      		return -1;
      	}
      
      	// 插入数据
      	strcpy(sql, "INSERT INTO STUDENT(ID,NAME,SCORE) VALUES (1001, 'JACK', 98);INSERT INTO STUDENT(ID,NAME,SCORE) VALUES (1002, 'MARY', 96);INSERT INTO STUDENT(ID,NAME,SCORE) VALUES (1003, 'TOM', 96);");
      	rc = sqlite3_exec(db, sql, callback, NULL, &zErrMsg);
      	if (rc != SQLITE_OK) {
      		printf("insert data failed, errMsg: %s", zErrMsg);
      		sqlite3_free(zErrMsg);
      		sqlite3_close(db);
      		return -1;
      	}
      
      	char stData[100] = { 0 };
      	strcpy(sql, "SELECT * FROM STUDENT;");
      	rc = sqlite3_exec(db, sql, callback, stData, &zErrMsg);
      	if (rc != SQLITE_OK) {
      		printf("query data failed, errMsg: %s", zErrMsg);
      		sqlite3_free(zErrMsg);
      		sqlite3_close(db);
      		return -1;
      	}
      
      	printf("stData = %s\n", stData);
      
      	// 同步接口
      	char **dbResult;
      	int nRow = 0, nColumn = 0;
      	strcpy(sql, "SELECT * FROM STUDENT;");
      	rc = sqlite3_get_table(db, sql, &dbResult, &nRow, &nColumn, zErrMsg);
      	if (rc != SQLITE_OK) {
      		printf("query data failed, errMsg: %s", zErrMsg);
      		sqlite3_free(zErrMsg);
      		sqlite3_close(db);
      		return -1;
      	}
      
      	// 打印字段名
      	for (int i = 0; i < nColumn; i++) {
      		printf("%s\t", dbResult[i]);
      	}
      	printf("\n");
      
      	//打印数据
      	for (int i = nColumn; i <= nRow * nColumn; i += nColumn) {
      		for (int j = 0; j < nColumn; j++) {
      			printf("%s\t", dbResult[i + j]);
      		}
      		printf("\n");
      	}
      
      	// 释放dbResult
      	sqlite3_free_table(dbResult);
      
      	sqlite3_close(db);
      
      	system("pause");
      	return 0;
      }
    
  • 打印结果
    在这里插入图片描述

参考

  • SQLite教程

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Chapter 13 Techniques of Design-Oriented Analysis: The Feedback Theorem

Chapter 13 Techniques of Design-Oriented Analysis: The Feedback Theorem 从这一章开始讲负反馈Control系统和小信号建模. 13.2 The Feedback Theorem 首先介绍 Middlebrook’s Feedback Theorem 考虑下面负反馈系统 传输函数 Guo/ui G ( s ) u o u i G ∞ T 1 T G…

C/C++火柴棍等式

有n根(n<24)火柴棍&#xff0c;你可以拼出多少个形如“ABC"的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零&#xff0c;则最高位不能是0)。用火柴棍拼数字0-9的拼法如图所示: 依次需要用到的火柴棍数目为6 2 5 5 4 5 6 3 7 6 。 如果是初学者可能会这么写。 …

Java多线程学习(一)

多线程学习&#xff08;二&#xff09;&#xff1a;http://t.csdnimg.cn/Q8Koc 目录 1、什么是多线程 2、如何创建多线程&#xff08;多个方法&#xff09; 方法一&#xff1a;继承Thread类创建线程 方法二&#xff1a;实现Runnable接口创建线程 方法三、实现Callable接口…

JDBC编程(Mysql)

目录 1.什么是jdbc 2.使用 2.1下载mysql数据库驱动 2.2导入项目 2.3编写代码 2.3.1数据源 2.3.2和数据库服务器建立连接 2.3.3构建一个操作数据库的sql语句 2.3.4执行sql 2.3.5释放前面创建的各种资源 2.3.6运行java程序 2.4其他操作 2.4.1修改操作 2.4.2删除操作…

微信小程序开发学习笔记——3.11完成form评论案例的实现逻辑

>>跟着b站up主“咸虾米_”学习微信小程序开发中&#xff0c;把学习记录存到这方便后续查找。 课程连接&#xff1a;https://www.bilibili.com/video/BV19G4y1K74d?p25&vd_source9b149469177ab5fdc47515e14cf3cf74 一、javascript参考手册——splice https://www.…

Instagram代运营和自营优缺点比较 CloudNEO:您全球社交媒体代运营的综合解决方案

在社交媒体营销中&#xff0c;Instagram作为一种非常受欢迎的平台&#xff0c;已成为企业推广品牌和吸引客户的重要工具。然而&#xff0c;对于企业来说&#xff0c;是选择代运营还是自营Instagram账号呢&#xff1f;让我们来比较一下它们各自的优缺点&#xff0c;并推荐CloudN…

plt保存PDF矢量文件中嵌入可编辑字体(可illustrator编辑)

背景&#xff1a; 用默认 plt.savefig() 保存图片&#xff0c;图中文字是以瞄点保存&#xff0c;而不是以文字格式。在编辑矢量图中&#xff0c;无法调整文字大小和字体。 方法&#xff1a; import matplotlib.pyplot as plt import numpy as np# ------输出的图片为illustr…

C#,动态规划问题中基于单词搜索树(Trie Tree)的单词断句分词( Word Breaker)算法与源代码

1 分词 分词是自然语言处理的基础,分词准确度直接决定了后面的词性标注、句法分析、词向量以及文本分析的质量。英文语句使用空格将单词进行分隔,除了某些特定词,如how many,New York等外,大部分情况下不需要考虑分词问题。但有些情况下,没有空格,则需要好的分词算法。…

2024年嵌入式校招

春招指的是一年中的春季招聘季节&#xff0c;即每年的3月份至5月份&#xff0c;是许多公司和组织开始招聘新毕业生或经验较少的求职者的时间。春招通常是大学生或研究生即将毕业&#xff0c;进入社会工作的重要时期。在这个时期&#xff0c;许多公司会举行一系列的宣讲会、招聘…

【原创】java+swing+mysql二手车交易管理系统

前言&#xff1a; 本文主要介绍了二手车交易管理设计与实现。首先&#xff0c;通过市场需求&#xff0c;我们确定了二手车的功能&#xff0c;通常的二手车交易系统都是B/S架构&#xff0c;然而我们今天要用javaswing去开发一个C/S架构的二手车交易管理系统&#xff0c;主要功能…

llinux C语言在网络编程时使用标准IO

目录 fdopen(3)函数 使用标准IO发送数据 使用标准IO接收数据 注意 先看一个简单的TCP客户端程序&#xff1a; #include <stdio.h> #include <arpa/inet.h> #include <sys/socket.h> #include <stdlib.h> #include <string.h> #include <…

【数据结构和算法初阶(C语言)】队列实操(概念实现+oj题目栈和队列的双向实现以及循环链表难点题目详解!)

目录 1. 队列的概念及结构 2.队列结构存在的意义应用 3.队列实现的结构选择 4.队列实现 5.队列对数据的处理 5.1队列初始化 5.2队尾入数据 5.3队头出数据 5.4获取队列尾部元素 5.5获取队列头部元素 5.6获取队列中元素个数 5.7检测队列是否为空 5.8销毁队列 6.循环队列补充 7.使…

C语言之快速排序

目录 一 简介 二 代码实现 快速排序基本原理&#xff1a; C语言实现快速排序的核心函数&#xff1a; 三 时空复杂度 A.时间复杂度 B.空间复杂度 C.总结&#xff1a; 一 简介 快速排序是一种高效的、基于分治策略的比较排序算法&#xff0c;由英国计算机科学家C.A.R. H…

矩阵中移动的最大次数

文章目录 所属专栏:BFS算法 题目链接 思路如下&#xff1a; 1.首先我们需要从第一列开始遍历&#xff0c;寻找每一个都能够满足条件的位置&#xff0c;将它插入到数组里面 2.第一列遍历完了后我们先判断第一列的数是否都满足条件插入到数组里面&#xff0c;如果数组为空&#…

03.事件进阶

一、事件流 事件流是对事件执行过程的描述&#xff0c;了解事件的执行过程有助于加深对事件的理解&#xff0c;提升开发实践中对事件运用的灵活度。 如上图所示&#xff0c;任意事件被触发时总会经历两个阶段&#xff1a;【捕获阶段】和【冒泡阶段】。 简言之&#xff0c;捕获…

肝了三天,完成了AIGC工具网站大全,建议收藏再看

说是肝了三天&#xff0c;其实远远不止&#xff0c;前前后后&#xff0c;从资料搜集到最后整理成文&#xff0c;有近一个月了&#xff0c;大家看在整理不易的份上&#xff0c;给点个赞吧&#xff0c;不要光顾着收藏呀&#xff01; 国内网站 AIGC 导航 https://www.aigc.cn 网…

wayland(xdg_wm_base) + egl + opengles 渲染使用纹理贴图的旋转 3D 立方体实例(十三)

文章目录 前言一、使用 stb_image 库加载纹理图片1. 获取 stb_image.h 头文件2. 使用 stb_image.h 中的相关接口加载纹理图片3. 纹理图片——cordeBouee4.jpg二、渲染使用纹理贴图的旋转 3D 立方体1. egl_wayland_texture_cube.c2. Matrix.h 和 Matrix.c3. xdg-shell-client-pr…

使用 pnpm 搭建 monorepo 项目

引言 在我之前的开发经历中&#xff0c;并没有实际使用过 Monorepo 管理项目&#xff0c;尽管之前对此有所了解&#xff0c;但并未深入探究。然而&#xff0c;如今许多开源项目都采纳了 Monorepo 方式&#xff0c;对于不熟悉它的开发者来说&#xff0c;阅读和理解这些项目的源…

关于使用过别人的GitHub/Gitee账号提交东西到仓库后,自己的仓库提交失败问题的解决方法

目录 引言 问题出现的原因 问题的解决方法 打开控制面板 方法一&#xff1a; 方法二&#xff1a; 进入Windows凭据管理器 结语 引言 这个问题折磨了我将近三个小时&#xff0c;为了减少有人和我一样走弯路且防止自己忘记解决方法&#xff0c;便有了这篇文章。 问题出现…

【洛谷 P8602】[蓝桥杯 2013 省 A] 大臣的旅费 题解(图论+深度优先搜索+树的直径+链式前向星)

[蓝桥杯 2013 省 A] 大臣的旅费 题目描述 很久以前&#xff0c;T 王国空前繁荣。为了更好地管理国家&#xff0c;王国修建了大量的快速路&#xff0c;用于连接首都和王国内的各大城市。 为节省经费&#xff0c;T 国的大臣们经过思考&#xff0c;制定了一套优秀的修建方案&am…