sqlite3入门教程(window)

1.sqlite3安装

sqlite3官网中下载对应zip,其中tools无论版本是多少,都需要下载。下载之后将两个文件中的内容都解压到同一个文件夹中,将文件夹的地址添加到系统变量中。此电脑—>属性—>高级系统设置—>环境变量—>系统变量,选择PATH环境变量进行编辑,将上述路径添加进去即可。然后后台运行命令sqlite3。下图为安装成功反应。

SQLite Download Page

 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_ROWSQLITE_DONESQLITE_ROW 表示查询语句返回了一行数据,而 SQLITE_DONE 表示查询执行完毕。
    • 在执行 SELECT 查询时,sqlite3_step 函数将返回 SQLITE_ROW,表示查询结果包含一行数据,然后你可以使用相关的函数(例如 sqlite3_column_intsqlite3_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;
    }

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLite数据库是一种轻量级的关系型数据库管理系统,具有小巧、快速、易用等特点,常用于嵌入式开发和移动应用开发。入门教程是帮助初学者快速掌握SQLite数据库基础知识和操作技巧的指南。 首先,SQLite数据库入门教程会介绍SQLite的特点和优势,以及适用的场景和应用领域。然后,教程会详细介绍如何安装和配置SQLite数据库,包括下载安装SQLite软件包和设置环境变量等步骤。 接着,教程会教授SQL语言的基本知识,包括创建数据库、表和字段等操作,以及对数据进行插入、查询、更新和删除等操作。通过实例演示和练习,初学者可以逐步掌握SQL语句的使用方法和编写技巧,提高数据库操作的熟练程度。 此外,入门教程还会介绍常用的SQLite命令行工具和GUI工具,如sqlite3、SQLiteStudio等,以及它们的使用方法和功能特点。初学者可以通过这些工具更方便地管理和操作SQLite数据库。 最后,教程还会介绍SQLite数据库的高级特性和扩展功能,如事务处理、索引优化、触发器等,帮助初学者进一步深入了解和应用SQLite数据库的高级技术。 总之,SQLite数据库入门教程是一个系统而全面的学习指南,能够帮助初学者快速入门并掌握SQLite数据库的基础知识和操作技巧。无论是对于嵌入式开发还是移动应用开发,学习SQLite数据库都是非常有帮助的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值