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系统上编译。
- 这个包下载解压后,分别执行以下命令编译安装
sh./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命令行执行以下命令
sh"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语句来操作
- 直接运行sqlite可执行程序,以Windows为例
-
创建或打开数据库
- 执行以下命令,就会打开或者一个数据库
sql.open student.db
-
创建表
*sqlCREATE TABLE STUDENT(ID INT PRIMARY KEY NOT NULL, NAME CHAR(128), SCORE INT);
-
插入数据
*sqlINSERT 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);
-
查询数据
*sqlSELECT * FROM STUDENT;
- 可以看到表中就有了我们插入的数据。
-
命令行的使用就不过多介绍,主要是SQL语句的使用。
SQLite API介绍
-
SQLite API编程常用的接口有以下几个
-
sqlite3_open
*cint sqlite3_open(const char *zFilename, sqlite3 **ppDb)
- 函数功能:打开一个指向 SQLite 数据库文件的连接
- 参数
- zFilename:数据库名
- ppDb : 数据库句柄
- 返回值:成功返回 SQLITE_OK
-
sqlite3_exec
*cint 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
*cint 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
*cint sqlite3_close(sqlite3 *db);
- 函数功能:关闭数据库
编程示例
c
#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;
}
- 打印结果