SQLite3介绍
SQLite是一种用C语言实现的的SQL数据库
它的特点有:轻量级、快速、独立、高可靠性、跨平台
它广泛应用在全世界范围内的手机电脑应用的内建数据库
官网地址:SQLite Home Page
SQLite因为其采用文件存储,且容易移植。在嵌入式中应用非常广泛,可以说是嵌入式业务开发的必学库
这次先讲一下怎么获取源码和使用
获取SQLite3源码
SQLite3的官网是https://www.sqlite.org/download.html
在官网找到sqlite-autoconf-3410200.tar.gz
文件下载,如下
wget https://www.sqlite.org/2023/sqlite-autoconf-3410200.tar.gz
tar -zxvf sqlite-autoconf-3410200
下载后解压,会发现里面很多其他的文件。其中,tea目录是(Tcl Extension Architecture)可以不用管
主要看里面的c文件和h文件,所以我们把源代码放到另一个目录
在工程目录创建一个目录lib/sqlite3,然后删除解压后的源码目录
cp sqlite-autoconf-3410200/*.c lib/sqlite3/
cp sqlite-autoconf-3410200/*.h lib/sqlite3/
rm -r sqlite-autoconf-3410200
将需要的头文件和源文件拷贝进去
有点强的是sqlite3.c文件的大小居然有8.3M
完成后目录树大概应该是这个样子的
├── build
├── CMakeLists.txt
├── main.cpp
└── lib
└── sqlite3
├── shell.c
├── sqlite3.c
├── sqlite3ext.h
├── sqlite3.h
└── sqlite3rc.h
编写CMake工程
其中shell.c是对应的命令行文件,我们可以不用添加。仔细研读官网的文档
所以CMakeLists.txt我们可以这么写
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(useSQLite LANGUAGES C CXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread")
add_executable(useSQLite main.cpp)
# lib sqlite3
include_directories(lib/sqlite3)
add_library(sqlite3
STATIC
lib/sqlite3/sqlite3.c)
target_link_libraries(sqlite3 dl)
#
target_link_libraries(useSQLite sqlite3)
# sqlite3-cli
add_executable(SQLite3-cli lib/sqlite3/shell.c)
target_link_libraries(SQLite3-cli sqlite3)
其中关于添加-ldl选项的步骤参考回答:c - CMake add -ldl at end of link stage of add_library - Stack Overflow
main.cpp
添加main.cpp
文件如下
#include <iostream>
#include <stdio.h>
#include <sqlite3.h>
static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
int i;
for (i = 0; i < argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
int main(int argc, char **argv) {
sqlite3 *db;
char *zErrMsg = 0;
int rc;
if (argc != 3) {
fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
return(1);
}
rc = sqlite3_open(argv[1], &db);
if (rc) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return(1);
}
rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
if (rc!=SQLITE_OK) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
sqlite3_close(db);
return 0;
}
简单讲一下这个源码,其实就是打开一个数据库文件执行一条指令
看上面的Usage: %s DATABASE SQL-STATEMENT\n就知道,参数是带引号的SQL语句
里面调用了三个库