基础操作
打开数据库文件
- int sqlite3_open(const char filename, sqlite3 ppDb);
该例程打开一个指向 SQLite 数据库文件的连接,返回一个用于其他 SQLite 程序的数据库连接对象。
如果 filename 参数是 NULL 或 ':memory:',那么 sqlite3_open() 将会在 RAM 中创建一个内存数据库,这只会在 session 的有效时间内持续。
如果文件名 filename 不为 NULL,那么 sqlite3_open() 将使用这个参数值尝试打开数据库文件。如果该名称的文件不存在,sqlite3_open() 将创建一个新的命名为该名称的数据库文件并打开。
操作数据(执行 sql 语句)
- int sqlite3_exec(sqlite3,const char sql,sqlite_callback,void ,char errmsg);
该例程提供了一个执行 SQL 命令的快捷方式,SQL 命令由 sql 参数提供,可以由多个 SQL 命令组成。
在这里,第一个参数 sqlite3 是打开的数据库对象,_sqlite_callback_ 是一个回调,_data_ 作为其第一个参数,errmsg 将被返回用来获取程序生成的任何错误。
sqlite3_exec() 程序解析并执行由 sql 参数所给的每个命令,直到字符串结束或者遇到错误为止。
关闭数据库
- int sqlite3_close(sqlite3*);
该例程关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关闭之前完成。
如果还有查询没有完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误消息。
编程实验
#include <stdio.h>
#include <sqlite3.h>
int main()
{
// 1. 打开数据库
sqlite3 *ppdb = NULL;
int ret = sqlite3_open("test.db", &ppdb);
if (ret != SQLITE_OK)
{
printf("open fail\n");
return -1;
}
// 2. 执行 sql 语句
// 2.1 创建表格 create table apitest(id int, number int);
const char *create_sql = "create table apitest(id int, number int)";
char *errmsg = NULL;
ret = sqlite3_exec(ppdb, create_sql, NULL, NULL, &errmsg);
if (ret != SQLITE_OK)
{
printf("%s\n", errmsg);
}
sqlite3_free(errmsg);
// 2.2 插入数据 insert into apitest(id int, number int)
const char *insert_sql = "insert into apitest values(0, 20200727)";
ret = sqlite3_exec(ppdb, insert_sql, NULL, NULL, &errmsg);
if (ret != SQLITE_OK)
{
printf("%s\n", errmsg);
}
sqlite3_free(errmsg);
// 3. 关闭数据库
ret = sqlite3_close(ppdb);
if (ret != SQLITE_OK)
{
printf("close fail\n");
}
return 0;
}
回调函数查询
#include <stdio.h>
#include <sqlite3.h>
/*
*@brief:数据查询回调函数,有多少行数据被调用多少次(返回值始终为0时)
*@param:arg: 由 sqlite3_exec 第 4 个参数传入
*@param:cols: 查询到的数据的列数
*@param:values: 一行数据字段值
*@param:names: 一行数据字段明
*@retval: 0 继续查询
*@retval: 1 终止查询
**/
int callback(void *arg, int cols, char **values, char **names) // 注意这里!!!
{
(void)(arg);
static int flag = 0;
if (flag == 0)
{
printf("cols = %d\n", cols);
for (int i=0; i<cols; ++i)
printf("%s\t", names[i]);
flag = 1;
}
printf("\n");
for (int i=0; i<cols; ++i)
printf("%s\t", values[i]);
return 0;
}
int main()
{
// 1. 打开数据库
sqlite3 *ppdb = NULL;
int ret = sqlite3_open("test.db", &ppdb);
if (ret != SQLITE_OK)
{
printf("open fail\n");
return -1;
}
// 2. 执行 sql 语句
// 2.1 创建表格 create table apitest(id int, number int);
const char *create_sql = "create table if not exists apitest(id int, number int)";
char *errmsg = NULL;
ret = sqlite3_exec(ppdb, create_sql, NULL, NULL, &errmsg);
if (ret != SQLITE_OK)
{
printf("%s\n", errmsg);
}
sqlite3_free(errmsg);
// 2.2 插入数据 insert into apitest(id int, number int)
const char *insert_sql = "insert into apitest values(0, 20200727)";
ret = sqlite3_exec(ppdb, insert_sql, NULL, NULL, &errmsg);
if (ret != SQLITE_OK)
{
printf("%s\n", errmsg);
}
sqlite3_free(errmsg);
// 2.3 回调函数查询
const char *select_sql = "select * from apitest";
ret = sqlite3_exec(ppdb, select_sql, callback, NULL, &errmsg); // 注意这里!!!
if (ret != SQLITE_OK)
{
printf("select fail\n");
}
sqlite3_free(errmsg);
// 3. 关闭数据库
ret = sqlite3_close(ppdb);
if (ret != SQLITE_OK)
{
printf("close fail\n");
return -1;
}
return 0;
}
输出:
cols = 2
id number
0 20200727
0 20200727
0 20200727
0 20200727
0 20200727
0 20200727
0 20200727
0 20200727
0 20200727
0 20200727
0 20200727
0 20200727
非回调函数查询
- int sqlite3_get_table(sqlite3* ppdb,const char *sql,char ***resultp,int *nrow,int *ncolumn,char **errmsg);
注:在查询大数据量时不推荐使用,将导致大量的堆空间被使用。
返回值:SQLITE_OK 成功
参数:
sqlite3* ppdb : 数据库句柄
const char *sql : sql查询语句
char ***resultp : 查询的到的数据表
int *nrow : 查到数据表的行
int *ncolumn : 查到的数据表的列
char **errmsg : 存储错误
sqlite3_free_table(resultp);//使用后要释放
sqlite3_free(errmsg)
#include <stdio.h>
#include <sqlite3.h>
int main()
{
// 1. 打开数据库
sqlite3 *ppdb = NULL;
int ret = sqlite3_open("test.db", &ppdb);
if (ret != SQLITE_OK)
{
printf("open fail\n");
return -1;
}
// 2. 执行 sql 语句
// 2.1 创建表格 create table apitest(id int, number int);
const char *create_sql = "create table if not exists apitest(id int, number int)";
char *errmsg = NULL;
ret = sqlite3_exec(ppdb, create_sql, NULL, NULL, &errmsg);
if (ret != SQLITE_OK)
{
printf("%s\n", errmsg);
}
sqlite3_free(errmsg);
// 2.2 插入数据 insert into apitest(id int, number int)
const char *insert_sql = "insert into apitest values(0, 20200727)";
ret = sqlite3_exec(ppdb, insert_sql, NULL, NULL, &errmsg);
if (ret != SQLITE_OK)
{
printf("%s\n", errmsg);
}
sqlite3_free(errmsg);
// 2.3 非回调函数查询
char **resultp = NULL;
int row, col;
ret = sqlite3_get_table(ppdb, "select * from apitest", &resultp, &row, &col, &errmsg);
if (ret == SQLITE_OK)
{
printf("%d:%d\n", row, col);
for (int i=0; i<(row+1); ++i) // 注意这里的访问范围 !!!
{
for (int j=0; j<col; ++j)
{
printf("%s\t", resultp[i * col +j]); // 注意这里的字符访问!!!
}
printf("\n");
}
}
else
{
printf("%s\n", errmsg);
}
sqlite3_free(errmsg);
sqlite3_free_table(resultp);
// 3. 关闭数据库
ret = sqlite3_close(ppdb);
if (ret != SQLITE_OK)
{
printf("close fail\n");
return -1;
}
return 0;
}
输出:
14:2
id number
0 20200727
0 20200727
0 20200727
0 20200727
0 20200727
0 20200727
0 20200727
0 20200727
0 20200727
0 20200727
0 20200727
0 20200727
0 20200727
0 20200727
查询结果结构说明:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。