1.sqlite3安装
sqlite3官网中下载对应zip,其中tools无论版本是多少,都需要下载。下载之后将两个文件中的内容都解压到同一个文件夹中,将文件夹的地址添加到系统变量中。此电脑
—>属性
—>高级系统设置
—>环境变量
—>系统变量
,选择PATH
环境变量进行编辑,将上述路径添加进去即可。然后后台运行命令sqlite3。下图为安装成功反应。
2.sqlite基本语法
创建数据库
sqlite3 datebase_name
//sqlite3 lht1.db
//这将打开名为 lht1.db 的 SQLite 数据库文件,并进入 SQLite 的交互式 shell 界面,您可以在其中执行 //SQL 查询和命令。
.open datebase_name
//若已经使用sqlite3进入交互shell界面,则使用.open
导入\导出数据库
使用 SQLite .dump 点命令来导出完整的数据库在一个文本文件中
sqlite3 testDB.db .dump > testDB.sql
上面的命令将转换整个 testDB.db 数据库的内容到 SQLite 的语句中,并将其转储到 ASCII 文本文件 testDB.sql 中。您可以通过简单的方式从生成的 testDB.sql 恢复
$sqlite3 testDB.db < testDB.sql
创建表,删除表
CREATE TABLE database_name.table_name(
column1 datatype PRIMARY KEY,
column2 datatype,
column3 datatype,
.....
columnN datatype,
);
主键(PRIMARY KEY),这意味着它必须是唯一的。当你尝试向表中插入一个具有与现有行相同
floors
值的新行时,就会触发唯一性约束。
.tables 命令来验证表是否已成功创建,该命令用于列出附加数据库中的所有表。
.schema table_name 命令得到表的完整信息。
DROP TABLE table_name;
//删除需谨慎再谨慎
插入
INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)] VALUES (value1, value2, value3,...valueN);
如果要为表中的所有列添加值,您也可以不需要在 SQLite 查询中指定列名称。
INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);
使用一个表来填充另外一个表
INSERT INTO first_table_name [(column1, column2, ... columnN)]
SELECT column1, column2, ...columnN
FROM second_table_name
[WHERE condition];
SELECTA语句
SQLite 数据库表中获取数据,以结果表的形式返回数据。这些结果表也被称为结果集。
SELECT column1, column2, columnN FROM table_name;
如果全部获取则使用*
SELECT * FROM table_name;
UPDATE语句
UPDATE 查询用于修改表中已有的记录。可以使用带有 WHERE 子句的 UPDATE 查询来更新选定行,否则所有的行都会被更新。
UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];
DELETE语句
DELETE 查询用于删除表中已有的记录。可以使用带有 WHERE 子句的 DELETE 查询来删除选定行,否则所有的记录都会被删除。
DELETE FROM table_name
WHERE [condition];
3.如何在VScode中使用sqlite3.h
将sqlite3官网下载的源文件解压后放在项目中,然后将原来下载的sqlite3.dll也添加到项目中。然后使用以下指令编译。
gcc main.cpp -o your_executable -lsqlite3 -lstdc++ -I. -L.
4.sqlite3 C/C++函数介绍
sqlite3_open
sqlite3_open
函数是 SQLite C/C++ 接口提供的函数之一,用于打开一个 SQLite 数据库文件。以下是对 sqlite3_open
函数的详细解释:
-
参数:
filename
:要打开的 SQLite 数据库文件的文件名,以 C 字符串形式传递。这个字符串通常是包含数据库文件路径的字符串。&db
:一个指向sqlite3*
类型指针的指针。该指针将用于存储打开的数据库连接句柄。
-
返回值:
int
类型。表示函数执行的结果或错误代码。常见的返回值包括:SQLITE_OK (0)
:操作成功完成。- 其他整数值:表示错误码。SQLite 定义了许多不同的错误码,例如
SQLITE_ERROR
表示通用错误,SQLITE_CANTOPEN
表示无法打开数据库等。
-
功能:
sqlite3_open
函数用于打开一个 SQLite 数据库文件,并返回一个表示数据库连接的句柄。- 如果指定的数据库文件存在,则将其打开;如果不存在,则会创建一个新的数据库文件。
- 打开成功后,可以使用返回的数据库连接句柄来执行后续的数据库操作,例如执行 SQL 查询、插入数据等。
sqlite3_exec
sqlite3_exec
函数是 SQLite C/C++ 接口提供的用于执行 SQL 语句的函数之一。它允许你执行一个或多个 SQL 语句,并为每个执行结果调用一个回调函数。以下是对 sqlite3_exec
函数的详细解释:
-
参数:
sqlite3 *db
:一个指向已经打开的 SQLite 数据库连接的指针。这个指针是通过sqlite3_open
函数打开数据库后返回的。const char *sql
:要执行的 SQL 语句,以 C 字符串的形式传递。sqlite_callback
:一个函数指针,指向一个回调函数,用于处理 SQL 执行结果。void *data
:一个指针,用于传递给回调函数的数据,通常是一个结构体或其他数据类型的指针。char **errmsg
:一个指向字符指针的指针,用于接收错误信息。如果执行过程中发生错误,将在此指针指向的位置存储错误信息。
-
返回值:
int
类型。表示函数执行的结果或错误代码。常见的返回值包括:SQLITE_OK (0)
:操作成功完成。- 其他整数值:表示错误码。SQLite 定义了许多不同的错误码,例如
SQLITE_ERROR
表示通用错误,SQLITE_CONSTRAINT
表示违反约束等。
-
功能:
sqlite3_exec
函数用于执行一个或多个 SQL 语句,并为每个执行结果调用一个回调函数。- 执行的 SQL 语句可以是任何合法的 SQLite SQL 语句,例如查询语句、插入语句、更新语句等。
- 每当执行一个 SQL 语句时,将调用指定的回调函数一次,回调函数可以处理执行结果或执行过程中的其他事件。
- 可以通过传递不同的回调函数来实现不同的功能,例如输出查询结果、处理执行过程中的错误等。
-
回调函数:
- 回调函数的原型通常为
int callback(void *data, int argc, char **argv, char **azColName)
,其中:data
:指向传递给sqlite3_exec
函数的void *data
参数。argc
:表示结果集中的列数。argv
:一个指向结果集中第一行数据的数组。azColName
:一个指向结果集中列名的数组。
- 回调函数的原型通常为
sqlite3_stmt*
sqlite3_stmt*
是 SQLite3 中用于表示预编译 SQL 语句的类型。以下是对 sqlite3_stmt*
的详细解释:
-
类型:
sqlite3_stmt*
是一个指向 SQLite3 语句对象的指针,它用于表示预编译的 SQL 语句。它的完整定义是typedef struct sqlite3_stmt sqlite3_stmt;
,即sqlite3_stmt
是一个结构体类型的别名。- 预编译的 SQL 语句不会立即执行,而是在后续需要执行时才进行。这样可以减少每次执行 SQL 查询时的解析和优化开销,从而提高执行效率。
-
作用:
sqlite3_stmt*
类型的指针用于存储一个经过预编译的 SQL 语句的信息和状态。预编译的 SQL 语句可以包含参数,可以重复执行,提高了执行效率。
-
创建:
- 要创建一个
sqlite3_stmt*
对象,通常需要使用sqlite3_prepare_v2
或类似的函数来预编译 SQL 语句。这些函数会返回一个sqlite3_stmt*
对象,该对象表示了预编译后的 SQL 语句。
- 要创建一个
-
使用:
- 一旦创建了
sqlite3_stmt*
对象,就可以使用该对象来执行预编译的 SQL 语句。可以通过调用sqlite3_step
函数来执行 SQL 语句的一次步骤,或者通过调用sqlite3_finalize
函数来释放sqlite3_stmt*
对象所占用的资源。
- 一旦创建了
-
参数绑定:
sqlite3_stmt*
对象还可以用于将参数绑定到 SQL 语句中。参数绑定允许动态地设置 SQL 语句中的参数值,以防止 SQL 注入攻击,提高了代码的安全性。
sqlite3_stmt* stmt;
const char* sql = "SELECT * FROM table WHERE column = ?";
int result = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
if (result != SQLITE_OK) {
// 处理错误
}
// 执行其他操作,如参数绑定、执行 SQL 语句等
sqlite3_prepare_v2
int sqlite3_prepare_v2(
sqlite3 *db, // SQLite 数据库连接对象
const char *sql, // 要编译的 SQL 语句
int sql_len, // SQL 语句的长度,如果为负数,则函数会自动计算长度
sqlite3_stmt **stmt, // 用于存储编译后的语句对象的指针
const char **tail // 指向未使用的部分的指针
);
-
参数:
sqlite3 *db
:一个指向已经打开的 SQLite 数据库连接的指针。const char *sql
:要编译的 SQL 语句,以 C 字符串形式传递。int sql_len
:可选参数,表示 SQL 语句的长度。如果指定了负数,则函数会自动计算字符串的长度。sqlite3_stmt **stmt
:一个指向sqlite3_stmt*
类型指针的指针,用于存储编译后的语句对象。const char **tail
:一个指向指针的指针,用于接收未使用的部分的指针。
-
返回值:
int
类型,表示函数执行的结果或错误代码。常见的返回值包括:SQLITE_OK (0)
:操作成功完成。- 其他整数值:表示错误码。SQLite 定义了许多不同的错误码,例如
SQLITE_ERROR
表示通用错误,SQLITE_NOMEM
表示内存分配失败等。
-
功能:
sqlite3_prepare_v2
函数用于编译一个 SQL 语句,并将其转换为一个预处理语句对象,以便后续执行。- 编译后的预处理语句对象包含了 SQL 语句的执行计划、优化信息以及参数绑定等信息。
- 编译后的预处理语句对象可以被多次执行,每次执行时都会使用相同的执行计划和优化信息,从而提高执行效率。
sqlite3_bind_text
sqlite3_bind_text
是 SQLite3 中用于将文本数据绑定到预处理语句中的函数。它的作用是将一个文本字符串或字节数组绑定到预处理语句中的参数上,以供后续执行。以下是对 sqlite3_bind_text
函数的详细解释
int sqlite3_bind_text(
sqlite3_stmt* stmt, // 预处理语句对象
int param_index, // 参数索引,从1开始
const char* value, // 要绑定的文本数据
int value_len, // 要绑定的文本数据的长度,如果为负数,则函数会自动计算长度
void (*destructor)(void*) // 可选参数,用于释放 value 内存的回调函数
);
-
参数:
sqlite3_stmt* stmt
:预处理语句对象,是通过sqlite3_prepare_v2
函数编译后得到的对象。int param_index
:要绑定的参数的索引,从1开始。const char* value
:要绑定的文本数据,以 C 字符串形式传递。int value_len
:可选参数,表示要绑定的文本数据的长度。如果指定了负数,则函数会自动计算字符串的长度。void (*destructor)(void*)
:可选参数,用于指定一个回调函数,在预处理语句对象被销毁时释放value
内存。如果不需要释放内存,可以传递NULL
。
-
返回值:
int
类型,表示函数执行的结果或错误代码。常见的返回值包括:SQLITE_OK (0)
:操作成功完成。- 其他整数值:表示错误码。SQLite 定义了许多不同的错误码,例如
SQLITE_ERROR
表示通用错误,SQLITE_NOMEM
表示内存分配失败等。
-
功能:
sqlite3_bind_text
函数用于将文本数据绑定到预处理语句中的参数上。- 绑定后的参数可以在执行预处理语句时被替换成指定的文本数据。
- 如果需要绑定的文本数据包含特殊字符,如单引号或换行符,SQLite 会自动进行转义处理,以确保数据的正确性和安全性。
sqlite3_step
sqlite3_step
是 SQLite3 中用于执行预处理语句的函数,它的作用是执行编译好的预处理语句,并返回执行结果。以下是对 sqlite3_step
函数的详细解释:
int sqlite3_step(sqlite3_stmt* stmt);
-
参数:
sqlite3_stmt* stmt
:预处理语句对象,是通过sqlite3_prepare_v2
函数编译后得到的对象。
-
返回值:
int
类型,表示函数执行的结果或错误代码。常见的返回值包括:SQLITE_ROW
:表示执行成功,并且查询语句返回了一行数据。SQLITE_DONE
:表示执行成功,并且查询语句执行完毕,没有返回更多的数据。- 其他整数值:表示错误码。SQLite 定义了许多不同的错误码,例如
SQLITE_ERROR
表示通用错误,SQLITE_CONSTRAINT
表示违反约束等。
-
功能:
sqlite3_step
函数用于执行预处理语句,并返回执行结果。- 在执行期间,预处理语句会被执行一次或多次,每次调用
sqlite3_step
函数执行一次查询步骤。 - 当调用
sqlite3_step
函数成功时,返回值为SQLITE_ROW
或SQLITE_DONE
。SQLITE_ROW
表示查询语句返回了一行数据,而SQLITE_DONE
表示查询执行完毕。 - 在执行 SELECT 查询时,
sqlite3_step
函数将返回SQLITE_ROW
,表示查询结果包含一行数据,然后你可以使用相关的函数(例如sqlite3_column_int
、sqlite3_column_text
等)来获取该行数据的具体内容。然后,你可以继续调用sqlite3_step
函数来获取下一行数据,直到它返回SQLITE_DONE
,表示已经处理完所有的查询结果。
sqlite3_stmt *stmt;
const char *sql = "SELECT column1, column2 FROM table";
// 准备 SQL 语句
int rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
if (rc != SQLITE_OK) {
// 错误处理
}
// 执行查询
while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {
// 读取查询结果中的每一行数据
int column1 = sqlite3_column_int(stmt, 0);
const unsigned char *column2 = sqlite3_column_text(stmt, 1);
// 处理查询结果
// 例如,将数据存储到变量中,打印到控制台等
}
// 检查是否处理完所有结果
if (rc != SQLITE_DONE) {
// 错误处理
}
// 释放语句对象
sqlite3_finalize(stmt);
sqlite3_finalize
sqlite3_finalize
函数用于释放预处理语句对象,它的作用是释放由 sqlite3_prepare_v2
函数创建的预处理语句对象所占用的资源,并清理相关的状态。以下是对 sqlite3_finalize
函数的详细解释:
int sqlite3_finalize(sqlite3_stmt* stmt);
-
参数:
sqlite3_stmt* stmt
:要释放的预处理语句对象,是通过sqlite3_prepare_v2
函数编译后得到的对象。
-
返回值:
int
类型,表示函数执行的结果或错误代码。常见的返回值包括:SQLITE_OK (0)
:操作成功完成。- 其他整数值:表示错误码。SQLite 定义了许多不同的错误码,例如
SQLITE_ERROR
表示通用错误,SQLITE_MISUSE
表示参数错误等。
-
功能:
sqlite3_finalize
函数用于释放预处理语句对象所占用的资源,并清理相关的状态。- 调用
sqlite3_finalize
函数后,预处理语句对象将不再可用,不能再次执行。通常情况下,需要在使用完预处理语句对象后调用sqlite3_finalize
函数进行释放,以避免资源泄漏。 - 如果预处理语句对象已经执行过并返回了结果,那么在调用
sqlite3_finalize
函数后,还可以通过其他函数来获取最终的执行结果。
sqlite3_close
sqlite3_close
函数用于关闭 SQLite 数据库连接,释放相关资源,并将数据库连接对象关闭。以下是对 sqlite3_close
函数的详细解释:
int sqlite3_close(sqlite3* db);
-
参数:
sqlite3* db
:要关闭的 SQLite 数据库连接对象。
-
返回值:
int
类型,表示函数执行的结果或错误代码。常见的返回值包括:SQLITE_OK (0)
:操作成功完成。- 其他整数值:表示错误码。SQLite 定义了许多不同的错误码,例如
SQLITE_ERROR
表示通用错误,SQLITE_BUSY
表示数据库忙等。
-
功能:
sqlite3_close
函数用于关闭 SQLite 数据库连接,并释放相关的资源。- 调用
sqlite3_close
函数后,将不再能够使用指定的数据库连接对象进行数据库操作。 - 在调用
sqlite3_close
函数之前,通常需要确保所有相关的预处理语句对象都已经释放,并且没有任何未完成的事务操作。
sqlite3_column_int
sqlite3_column_int
是 SQLite3 中用于从结果集中获取整数类型数据的函数。以下是对 sqlite3_column_int
函数的详细解释:
int sqlite3_column_int(sqlite3_stmt* pStmt, int columnIndex);
-
参数:
sqlite3_stmt* pStmt
:预处理语句对象,通过sqlite3_prepare_v2
编译后得到的对象。int columnIndex
:要获取数据的列索引,从0开始。
-
返回值:
int
类型,表示从结果集中获取的整数值。如果列中的数据类型不是整数类型,则返回值将被转换为整数。
-
功能:
sqlite3_column_int
函数用于从预处理语句执行结果中获取整数类型数据。- 它接受两个参数,第一个参数是预处理语句对象,第二个参数是要获取数据的列索引。
- 函数返回指定列的整数值。如果列中的数据类型不是整数类型,SQLite 会尝试将其转换为整数类型。如果无法转换,返回值为0。
5.使用上面函数搭建基本功能
使用这些基础函数搭建基本函数进行对数据库的操作,如,打开创建一个数据库,新键表,插入数据,删除数据,更改数据,查看数据。
打开一个数据库
bool openDatabase(const char* filename) {
int result = sqlite3_open(filename, &db);
if (result != SQLITE_OK) {
std::cerr << "Failed to open database: " << sqlite3_errmsg(db) << std::endl;
return false;
}
std::cout << "Database opened successfully." << std::endl;
return true;
}
新建表
bool createTable() {
char *errMsg = nullptr;
std::string sql = "CREATE TABLE IF NOT EXISTS floors ("
"floors char(50) primary key NOT NULL,"
"time_id int NOT NULL"
");";
int result = sqlite3_exec(db, sql.c_str(), nullptr, nullptr, &errMsg);
if (result != SQLITE_OK) {
std::cerr << "SQL error: " << errMsg << std::endl;
sqlite3_free(errMsg);
return false;
}
return true;
}
插入数据
bool insertDatabase(const std::string& floors, const int time_id) {
if (!db) {
std::cerr << "Database is not open." << std::endl;
return false;
}
std::string sql = "INSERT INTO floors (floors, time_id) VALUES (?, ?);";
sqlite3_stmt* stmt;
int result = sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, nullptr);
if (result != SQLITE_OK) {
std::cerr << "Failed to prepare statement: " << sqlite3_errmsg(db) << std::endl;
return false;
}
result = sqlite3_bind_text(stmt, 1, floors.c_str(), -1, SQLITE_STATIC);
result |= sqlite3_bind_int(stmt, 2, time_id);
if (result != SQLITE_OK) {
std::cerr << "Failed to bind parameters: " << sqlite3_errmsg(db) << std::endl;
sqlite3_finalize(stmt);
return false;
}
result = sqlite3_step(stmt);
if (result != SQLITE_DONE) {
std::cerr << "Failed to execute statement: " << sqlite3_errmsg(db) << std::endl;
sqlite3_finalize(stmt);
return false;
}
std::cout << "Database updated successfully." << std::endl;
sqlite3_finalize(stmt);
return true;
}
删除对应数据
bool deleteDatabase(const std::string& condition) {
sqlite3_stmt *stmt;
const char *tail;
std::string sql = "DELETE FROM floors WHERE " + condition + ";";
int result = sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, &tail);
if (result != SQLITE_OK) {
std::cerr << "SQL error: " << sqlite3_errmsg(db) << std::endl;
sqlite3_close(db);
return false;
}
result = sqlite3_step(stmt);
if (result != SQLITE_DONE) {
std::cerr << "Execution failed: " << sqlite3_errmsg(db) << std::endl;
sqlite3_finalize(stmt);
sqlite3_close(db);
return false;
}
std::cout << "Database delete successfully." << std::endl;
sqlite3_finalize(stmt);
return true;
}