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

SQLite介绍

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

SQLite相关链接

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;
      }
    
  • 打印结果
    在这里插入图片描述

参考

  • 24
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值