📅  最后修改于: 2023-12-03 15:35:07.498000             🧑  作者: Mango
SQLite是一种轻型的关系型数据库管理系统,它的设计目标是嵌入式的,即程序和数据库可以在同一个进程中运行,简单易用,完全免费,是一个非常受欢迎的数据库引擎。SQLite-C++是一个基于SQLite的C++封装类库,它提供了比较简洁的API接口,使用起来非常方便。
使用SQLite-C++之前,需要先安装SQLite。SQLite的官方网站提供了很多编译好的版本,可以根据自己的操作系统和平台选择相应的版本进行安装。
在使用SQLite-C++之前,需要先引入相应的头文件。SQLite-C++提供的头文件是sqlite3.h,在源代码中可以找到这个文件。
#include "sqlite3.h"
在SQLite中,数据库文件就是一个文件,可以通过sqlite3_open函数打开一个数据库文件。这个函数的第一个参数是数据库文件的路径,第二个参数是一个指向sqlite3结构体的指针,用于保存打开的数据库对象。
sqlite3* db;
int ret = sqlite3_open("test.db", &db);
if (ret != SQLITE_OK) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return -1;
}
执行SQL语句的方法有两种:一种是使用sqlite3_exec函数,另一种是使用sqlite3_prepare、sqlite3_step和sqlite3_finalize三个函数。sqlite3_exec函数比较简单,它的第一个参数是数据库对象,第二个参数是执行的SQL语句,第三个参数是一个回调函数,用于处理每一行返回的记录,第四个参数是一个指向数据的指针,第五个参数是一个错误信息的指针。
char* err_msg = nullptr;
int ret = sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS USER (ID INT PRIMARY KEY, NAME TEXT, AGE INT)", nullptr, nullptr, &err_msg);
if (ret != SQLITE_OK) {
fprintf(stderr, "Can't create table: %s\n", err_msg);
sqlite3_free(err_msg);
sqlite3_close(db);
return -1;
}
使用sqlite3_prepare、sqlite3_step和sqlite3_finalize函数执行SQL语句的代码如下:
sqlite3_stmt* stmt = nullptr;
ret = sqlite3_prepare(db, "INSERT INTO USER (ID, NAME, AGE) VALUES (?, ?, ?)", -1, &stmt, nullptr);
if (ret != SQLITE_OK) {
fprintf(stderr, "Can't prepare statement: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return -1;
}
sqlite3_bind_int(stmt, 1, 1);
sqlite3_bind_text(stmt, 2, "Tom", -1, nullptr);
sqlite3_bind_int(stmt, 3, 18);
ret = sqlite3_step(stmt);
if (ret != SQLITE_DONE) {
fprintf(stderr, "Can't insert data: %s\n", sqlite3_errmsg(db));
sqlite3_finalize(stmt);
sqlite3_close(db);
return -1;
}
sqlite3_finalize(stmt);
SQLite提供了一些API接口用于查询数据,最简单的方法是使用sqlite3_get_table函数,它可以把查询结果存储在一个二维数组中。
char** results = nullptr;
int rows, cols;
ret = sqlite3_get_table(db, "SELECT * FROM USER WHERE AGE > 10", &results, &rows, &cols, &err_msg);
if (ret != SQLITE_OK) {
fprintf(stderr, "Can't get data: %s\n", sqlite3_errmsg(db));
sqlite3_free(err_msg);
sqlite3_close(db);
return -1;
}
for (int i = 0; i < rows + 1; i++) {
for (int j = 0; j < cols; j++) {
printf("%s\t", results[i*cols + j]);
}
printf("\n");
}
sqlite3_free_table(results);
使用完数据库之后,需要关闭数据库,释放资源。
sqlite3_close(db);
SQLite-C++是一个非常好用的库,使用方便,接口简洁,完美地封装了SQLite的C语言API。由于SQLite本身就是一个非常轻量级的数据库,因此SQLite-C++具有比其他数据库更小的内存占用和更快的访问速度。如果需要在C++中使用数据库,SQLite-C++是一个不错的选择。