SQLite是一种用C语言实现的的SQL数据库
它的特点有:轻量级、快速、独立、高可靠性、跨平台
它广泛应用在全世界范围内的手机电脑应用的内建数据库
官网地址:https://www.sqlite.org/index.html
SQLite因为其采用文件存储,且容易移植。在嵌入式中应用非常广泛,可以说是嵌入式业务开发的必学库
这次先讲一下怎么获取源码和使用
SQLite3的官网是https://www.sqlite.org/download.html
在官网找到文件下载,如下
tar -zxvf sqlite-autoconf-3410200
下载后解压,会发现里面很多其他的文件。其中,tea目录是(Tcl Extension Architecture)可以不用管
主要看里面的c文件和h文件,所以我们把源代码放到另一个目录
在工程目录创建一个目录lib/sqlite3,然后删除解压后的源码目录
const char *zSql,
sqlite3_callback xCallback,
void *pArg,
char **pzErrMsg
){
第一个参数是数据库的句柄,用于操作数据库用的。
第二个参数是传递给SQLite执行的SQL语句
第三个参数是执行后的回调函数
第四个参数是回调函数的第一个参
第五个参数是如果执行语句错误,用于返回错误信息的字符串指针
那么第三个参数和第四个参数可以根据需要置为空或者给一个函数指针和一片内存(通常第四个参数用来返回执行后的结果)
不需要回调的示例,参考如下代码
int create_table(sqlite3 *pdb) {
char *sql=NULL;
char *errmsg=NULL;
int ret;
sql=(char*)”create table if not exists mytable (id integer primary key,name text);”;
ret=sqlite3_exec(pdb, sql, NULL, NULL, &errmsg);
if(SQLITE_OK !=ret) {
printf(“create table error! %s\n”, errmsg);
return -1;
} else {
return 0;
}
}
上面的sql的值就是建表的一个操作,可以参考上面SQL语句的相关介绍。因为建表操作我们只需要知道建表成功了还是失败了,所以我们不需要填充xCallback和pArg参数,自然填NULL的时候不会调用到回调
需要调用回调的示例,参考如下代码
int show_row(void *return_, int column, char* result[], char** column_name) {
for(int i=0; i < column; i++) {
printf(“%s\t”, result[i]);
}
printf(“\n”);
return 0;
}
// 查询和显示所有mytable的数据
int query_all_and_show(sqlite3* pdb) {
char sql[24]={0};
char *errmsg=NULL;
int ret;
strncpy(sql, “select * from mytable;”, 22);
// 数据库,语句字符串,回调函数,用户输入的参数,最终传给回调函数使用,错误信息
ret=sqlite3_exec(pdb, sql, show_row, NULL, &errmsg);
if(SQLITE_OK !=ret) {
printf(“select exec error: %s\n”, errmsg);
return -1;
}
return 0;
}
上述代码查询了当前mytable表里面的所有行的数据,上面的会调函数当有多行的时候会调用多次。每一次都可以将一行的数据打印出来
如果需要将表返回到主函数,可以在pArg参数那里填充一个结构体链表指针(或者vector),然后每次创建一项就可以返回整张表的内容。
除了sqlite3_exec()函数,SQLite3还提供了一个函数可以执行语句,并且可以在同一个函数中处理返回的数据,像上述的查表的操作其实用这个函数会更好一点
sqlite3 *db,
const char *zSql,
char ***pazResult,
int *pnRow,
int *pnColumn,
char **pzErrMsg
){
同样的,我们看下参数,第一个参数是数据库句柄,第二个参数是需要执行的SQL语句
第三个参数是返回的结果的表
第四个参数是一共有多少行
第五个参数是一共有多少列
第六个参数是产生错误时的错误信息返回
这里不讲具体的写法了,输出行列值可以参考以下写法
for(int j=0; j < Row; j++) {
printf(“%s\t”, azResult[i*Row+j]);
}
printf(“\n”);
}
SQLiteC++是一个简洁易用的C++封装库
正常我们用C语言去编程,可以像上面章节说的,自己去封装相关的操作。如果你的项目用上了C++,那么我推荐用C++封装的库去写,会比较方便一点。
上面C语言编程的章节,介绍了相关操作数据库的流程,这里不再重复介绍
我们看下使用SQLiteC++最简单的示例是怎么样的,首先SQLiteC++的源码在:https://github.com/SRombauts/SQLiteCpp
我们可以创建一个工程,然后获取SQLiteC++的源码
git clone https://github.com/SRombauts/SQLiteCpp.git
cd SQLiteCpp
git submodule init
git submodule update
在examples/example2/src路径下有一个示例的main.cpp,我们可以通过观察这个文件学习SQLiteC++库的相关操作,在useSQLiteCpp目录创建main.cpp,内容如下
#include “SQLiteCpp/SQLiteCpp.h”
// https://www.cnblogs.com/nbtech/p/use_sqlite_library.html
int main() {
try
{
// Open a database file in create/write mode(用写模式打开一个数据库文件)
SQLite::Database db(“test.db3”, SQLite::OPEN_READWRITE|SQLite::OPEN_CREATE);
std::cout << “SQLite database file ‘” << db.getFilename().c_str() << “‘ opened successfully\n”;
// Create a new table with an explicit “id” column aliasing the underlying rowid(创建一个表,id设置为主键)
db.exec(“DROP TABLE IF EXISTS test”);
db.exec(“CREATE TABLE test (id INTEGER PRIMARY KEY, value TEXT)”);
// first row(插入一行,id是NULL就是不指定,不指定会从1开始分配,value是test)
int nb=db.exec(“INSERT INTO test VALUES (NULL, “test”)”);
std::cout << “INSERT INTO test VALUES (NULL, “test”)”, returned ” << nb << std::endl;
// second row(插入第二行,id是2,根据上一条记录加一,value是second)
nb=db.exec(“INSERT INTO test VALUES (NULL, “second”)”);
std::cout << “INSERT INTO test VALUES (NULL, “second”)”, returned ” << nb << std::endl;
// update the second row(将id为2的行的value值更新为second-updated)
nb=db.exec(“UPDATE test SET value=”second-updated” WHERE id=’2′”);
std::cout << “UPDATE test SET value=”second-updated” WHERE id=’2’, returned ” << nb << std::endl;
// Check the results : expect two row of result(读取结果,应该会有两行数据。其实就是查表)
SQLite::Statement query(db, “SELECT * FROM test”);
std::cout << “SELECT * FROM test :\n”;
while (query.executeStep())
{
std::cout << “row (” << query.getColumn(0) << “, “” << query.getColumn(1) << “”)\n”;
}
db.exec(“DROP TABLE test”); // 删除test这个表
}
catch (std::exception& e)
{ // 异常处理
std::cout << “SQLite exception: ” << e.what() << std::endl;
return EXIT_FAILURE; // unexpected error : exit the example program
}
// remove(“test.db3”); // 删除文件
return 0;
}
上面的几个操作总结就是:
1、声明一个db文件,以什么形式打开SQLite::Database db(“test.db3”, SQLite::OPEN_READWRITE|SQLite::OPEN_CREATE);
2、通过exec方法执行各种SQL语句,db.exec(const char* );
3、定义查询语句,并获取结果SQLite::Statement query(db, “SELECT * FROM test”);
4、异常处理
根据上面的注释内容可以知道这个main.cpp做了哪些事情
编写CMake工程也比较简单,SQLiteC++是通过CMake管理的,所以添加为子项目即可
project(useSQLiteCpp LANGUAGES CXX)
add_executable(useSQLiteCpp main.cpp)
# SQLiteCpp
include_directories(SQLiteCpp/include)
option(SQLITECPP_RUN_CPPLINT “Not Run cpplint.py tool for Google C++ StyleGuide.” OFF)
add_subdirectory(SQLiteCpp lib)
target_link_libraries(useSQLiteCpp SQLiteCpp)
编译就不描述了
数据库在业务开发中是非常常见的,而SQLite3被广泛应用在各个领域。并且由于它的小型无服务器结构并且依靠文件存储,也被广泛应用在各种嵌入式系统中
所以说,了解SQLite3几乎是从事嵌入式业务开发的必选项
本文从SQLite3的库的获取、工程管理、SQL语句介绍、C语言编程四个角度阐述了SQLite3数据库的实际应用。希望对你的数据收集、数据管理有一定的启蒙作用。
but, not yet
相信这对你只是一个开始,当前时代是信息的时代,我们需要的数据越来越庞大,大数据在生活的各个角落起着越来越重要的作用。
在各种高并发、大流量的场景下,SQLite3还是不够用。我们不能停下脚步,我们的目标是星辰大海。
到此这篇关于SQLite3数据库的介绍和使用(面向业务编程-数据库)的文章就介绍到这了,更多相关SQLite3介绍和使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!