15. SQLite数据库

逐段拆解 SQLite 这两个核心接口,通俗讲明白

一、先看懂第一行:回调函数类型定义

c 复制代码
typedef int (*sqlite3_callback)(void *, int, char **, char **);

拆开翻译

  1. typedef:给复杂类型起别名,简化代码
  2. int (*xxx)(...):这是函数指针类型
    代表:一个函数,返回值是int,参数固定4个:
    • void *:自定义传参,你外面随便传数据进来
    • int:当前这一行查询结果有多少列
    • char **:当前行每一列的数据(字符串数组)
    • char **:每一列的字段名(表头)

回调函数作用

只有执行SELECT查询语句 时才会触发:数据库每查到一行数据,就自动调用一次这个函数,你在里面写代码处理查到的数据(打印、存变量等)。

如果是建表/插入/删除,没有查询结果,回调不会执行,可以填NULL

举个最简单的回调示例

c 复制代码
// 符合 sqlite3_callback 格式的回调函数
int myCallback(void* arg, int colNum, char** colData, char** colName)
{
    // 遍历一行所有列
    for(int i=0; i<colNum; i++)
    {
        printf("%s = %s | ", colName[i], colData[i]);
    }
    printf("\n");
    return 0;
}

二、第二个核心函数:sqlite3_exec

c 复制代码
int sqlite3_exec(sqlite3 *db, const char *sql, sqlite3_callback callback, void *, char **errmsg);

逐个参数大白话解释

  1. sqlite3 *db 数据库句柄
    打开数据库时拿到的指针,相当于数据库的"钥匙",用来指定操作哪个数据库文件。
  2. const char *sql SQL语句字符串
    写你要执行的命令:CREATE TABLEINSERTSELECTDELETE 等。
  3. sqlite3_callback callback 回调函数指针
    查询语句填刚才写好的回调函数名;
    增删改、建表无返回数据,直接填NULL
  4. void * 自定义参数(传给回调第一个参数)
    你想往回调里传什么数据就填什么,不用就填NULL
  5. char **errmsg 错误信息输出
    传一个char*变量的地址,如果SQL执行失败,SQLite会在这里分配内存存错误文本;
    成功执行则不会赋值。用完必须调用sqlite3_free()释放这段内存,否则内存泄漏。

返回值

  • 0:执行成功
  • 非0数字:执行失败,对应具体错误码,错误详情存在errmsg

三、完整可运行极简示例(一看就懂)

c 复制代码
#include <stdio.h>
#include "sqlite3.h"

// 定义查询回调
int printData(void* arg, int colCnt, char** data, char** name)
{
    for(int i=0; i<colCnt; i++)
    {
        printf("%s:%s  ", name[i], data[i]);
    }
    puts("");
    return 0;
}

int main()
{
    sqlite3* db;
    char* err = NULL;
    // 1. 打开数据库 test.db
    sqlite3_open("test.db", &db);

    // 2. 建表语句,无查询,回调填NULL
    const char* createSql = "CREATE TABLE IF NOT EXISTS user(id INT, name TEXT);";
    sqlite3_exec(db, createSql, NULL, NULL, &err);

    // 3. 插入数据
    const char* insertSql = "INSERT INTO user VALUES(1,'小明');";
    sqlite3_exec(db, insertSql, NULL, NULL, &err);

    // 4. 查询语句,需要传回调接收数据
    const char* selectSql = "SELECT * FROM user;";
    sqlite3_exec(db, selectSql, printData, NULL, &err);

    // 释放错误信息内存
    if(err != NULL)
    {
        sqlite3_free(err);
    }
    // 关闭数据库
    sqlite3_close(db);
    return 0;
}

四、核心总结

  1. sqlite3_callback:规定查询结果处理函数的固定格式,每一行数据触发一次;
  2. sqlite3_exec:万能执行函数,所有SQL都靠它跑;
    • 增/删/改/建表:回调填NULL
    • SELECT查询:必须传入回调函数接收查到的数据;
  3. errmsg 是输出型参数,用来拿报错文字,用完要释放内存;
  4. 返回0代表执行成功,非0代表SQL出错。