开发者学堂课程【嵌入式之 RFID 开发与应用2020版:SQLite 数据库 C 编程接口介绍】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/665/detail/11235
SQLite 数据库 C 编程接口介绍
内容介绍:
一、SQLite C 编程
1.打开、关闭数据库函数
2.Sqlite3 中执行 SQL 语句的方法(回调方法)
3.Sqlite3 中执行 SQL 语句的方法(非回调方法)
一、SQLite C 编程
主要用到四个函数,打开;关闭;回调方法;非回调方法。
下图是源代码和头文件,头文件提供了很多函数接口,主要用到的是以上四个。
Makefile:
OBJ+=example.0
OBJ +=sqiite3.0
FLAGS =-wall
CC = gcc
example : $ (OBJ)
$ (cc) $ (OBJ) -o $ $ (FLAGS) -lpthread -ldl
%.o:%.c
s (cc) -c $^-o $$ (FLAGS)
.PHONY :clean
clean :
rm example *.o -rfv
Makefile 编译的对象是 sqlite3.0,为什么用 Makefile 编译:因为 sqlite 代码比较多,编译时间较长,如果编译完 sqlite,由 Makefile 进行时间戳的管理,下一次改写业务程序是不需要编 sqlite3.0,这样就提高了调试的效率。
打开一个新的窗口,观看程序,里面只包含头文件。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "sqlite3.h"
int main (int argc, char **argv)
{
return 0;
}
在窗口进行编译,发现时间比较长,正常情况下编写程序只需 1~2 秒,但是如果下一次在进行编译,时间就变短了,因为sqlite已经编好了。
edu@edu : sqlite$make
gcc -c example.c -o example.o -wall
gcc -c sqlite3.c -o sqlite3.o -wall
sqlite3.c:8153:26: warning: 'sqlite3one’defined but not used [-Munused-const-variable=]
SQLITE_PRIVATEconst int sqlite3one = 1;
1.打开、关闭数据库函数
int sqlite3_open(char *db_name,sqlite3 **db);
通过 open 打开数据库,在代码中要调用函数 sqlite3_open()
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "sqlite3.h"
int main (int argc, char **argv)
{
sqlite3_open()
return 0;
}
sqlite3 **db 句柄,无论是后续关闭,执行语句都是基于这个参数。
功能: 打开数据库。
参数:db_name: 数据库文件名,若文件名包含 ASCII 码表范围的之外的字符,则其必需是(UTF-8)编码。sqlite3: 数据库标识,此结构体为数据库操作句柄。通过此句柄可对数据库文件进行相应操作。
返回值: 成功返回 SQLITE_OK,失败返回非 SQLITE_OK。
Sqlite 数据库最大特点是它的数据并不是通过返回值实现传递,而是通过参数,返回值是告诉操作是否成功,成功返回 SQLITE_OK,失败返回非 SQLITE_OK,不是ok 就要去查错误列表。
int sqlite3_close(sqlite3 *db);
功能:关闭数据库、释放打开数据库时申请的资源。
参数: db:数据库的标识。
返回值: 成功返回 SQLITE_OK。失败返回非 sQLITE_OK。
注意: sqlite3 使用了两个库: pthread、dl,故链接时应加上 -lpthread 和 -ldl。
2.Sqlite3 中执行 SQL 语句的方法(回调方法)
sqlite3_exec 函数:
int sqlite3_exec(sqlite3*db,
const char *sql,
——实际是不可修改的字符串
exechandler_t callback,
回调函数,如果没有结果可传null,如果不为空,在回调函数中处理得到的结果。
void *arg,
char**errmsg);
功能:执行 sql 指向的 SQL 语句,若结果集不为空,函数会调用函数指针 callback所指向的函数。
参数: db: 数据库的标识。
sql: SQL 语句(一条或多条),以’;’结尾。
calback: 是回调函数指针,当这条语句执行之后,sqlite3 会去调用你提供的这个函数。
arg: 当执行 sqlite3_exec 的时候传递给回调函数的参数。
errmsg: 存放错误信息的地址,执行失败后可以查阅这个指针。
打印错误信息方法: printf("%sin", errmsg);
回调函数指针:
typedef int (*exechandler_t)(void*para,
int n_column,
char**column_value,
char**column_name);
功能: 此函数由用户定义,当 sqlite3_exec 函数执行 sql 语句后,结果集不为空时sqlite3_exec 函数会自动调用此函数,每次调用此函数时会把结果集的一行信息传给此函数。
参数: para: sqlite3_exec 传给此函数的参数,para 为任意数据类型的地址。
n_column: 结果集的列数。
column_value: 指针数组的地址,其存放一行信息中各个列值的首地址。
column name: 指针数组的地址.其左放一行信息中各个列值对应列名的首地址。
返回值: 若为非 0 值,则通知 sqlite3_exec 终止回调。
我们可以通过以上回调函数查看表信息,如果想查看更多信息,就要用到下面的函数。
3.Sqlite3 中执行 SQL 语句的方法(非回调方法)
sqlite3_get_table 函数:是专门用来获取表信息的,可以配合 select 使用。
int sqlite3_get_table(sqlite3*db,
const char *sql,
char ***resultp,
int *nrow,
int *ncolumn,
char**errmsg);
功能: 执行 sql 指向的 SQL 语句,函数将结果集相关的数据的地址保存在函数的参数中。
参数: db: 数据库的标识。
sql: SQL 语句(一条或多条),以’;’结尾。
resultp: 指针数组的地址,其记录了结果集的数据。内存布局:先依次存放各列的列名,然后是每一行各列的值。
nrow: 结果集的行数(不包含列名)。
ncolumn: 结果集的列数。
errmsg: 错误信息。
sqlite3_free_table 函数:
void sqlite3_free_table(char**resultp);
功能: 释放 sqlite3_get_table 分配的内存。
参数: 结果集数据的首地址。
空间是动态获得的,当空间用完之后要释放空间。下节课主要讲数据库怎样通过函数接口进行操作。
数据结果如下
Id、name、city、score 是第一行,依次类推后面的是个数据分别对应 id、name;是按找先行后列的形式存储的,故在遍历时要知道存储关系。