一、相关API
1、sqlite3_open 函数
函数功能:打开数据库,不存在则创建
函数原型:int sqlite3_open(const char *filename, sqlite3 **ppDb);
参数说明:filename========>数据库文件名 xxxx.db
ppDb========>存储数据库属性 类似于文件指针
返回值: SQLITE_OK 成功
其它 失败
2、sqlite3_open_v2 函数
函数功能:打开数据库,并可以设置打开属性(读写权限,是否新建等)
函数原型:
int sqlite3_open_v2(const char *filename,sqlite3 **ppDb,int flags,const char *zVfs);
参数说明:filename========>数据库文件名 xxxx.db
ppDb========>存储数据库属性 类似于文件指针
flag========>打开设置属性
zVfs========>一般写 NULL
常用的flag:
1、SQLITE_OPEN_READONLY
数据库以只读模式打开。如果指定的数据库不存在,则返回错误码。
2、SQLITE_OPEN_READWRITE
在操作系统没有对数据库文件设置了写保护的情况下,数据库以读写模式打开,否则以只读模式打开。不管是那种情况,数据库必须已经存在,否则将返回错误码。
3、SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE
数据库以读写模式打开,如果该数据库不存在则创建它。这也是sqlite3_open()和sqlite3_open16()的默认行为。如果参数flag不是由以上选项和以下的可选项组成的话,函数的行为是不可预知的。
返回值: SQLITE_OK 成功
其它 失败
3、sqlite3_exec 函数
函数功能:实现 sqlite3 命令行操作
函数原型:
int sqlite3_exec(sqlite3*db, const char *sql,
int (*callback)(void*,int,char**,char**), void *p, char **errmsg);
参数说明: db========>sqlite3_open 所获取的ppDb
sql========>命令操作
callback========>有显示时的回调函数
p========>传入callback的参数
errmsg========>错误信息保存
callback函数参数说明:
void * ===========>携带的额外的参数
int ===========>表有多少列
第一个char**===========>字段信息
第二个char**===========>字段名字
这个回调函数的特点:有多少行被输出则调用几次
返回值: SQLITE_OK 成功
其它 失败
4、sqlite3_close 函数
函数功能:关闭数据库
函数原型:
int sqlite3_close(sqlite3*);
int sqlite3_close_v2(sqlite3*);
参数说明:sqlite3_open 获得的ppDb
返回值: SQLITE_OK 成功
其它 失败
sqlite3官网公示的API说明:http://www.sqlite.org/c3ref/funclist.html
二、测试代码
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <pthread.h>
#include "sqlite3.h"
static int calltimes = 0;
// 1,每当sqlite3_exec()从数据库中读取到一条记录(即一行)时,会立即调用该函数
// 2,arg: 这是自定义的参数,通过sqlite3_exec()的第四个参数传递过来
// 3,argc: 这是当前记录的列数目
// 4,argv: 这是当前记录的每一列的值
// 5,azColName: 这是当前记录的每一列的名称
static int callback(void *arg, int argc, char **argv, char **azColName)
{
int i;
for(i=0; i<argc; i++)
{
printf("%s=%s\t", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
// 一般而言,返回值必须为0
// 如果返回值不等于0,那就意味着中断对剩下的记录的处理
return 0;
}
int showtable(void *arg, int argc, char **argv, char **name);
int Sqlite3_exec(sqlite3 *db, const char *sql,
int (*callback)(void *, int, char **, char **), void *p,
char **perrmsg)
{
int ret = sqlite3_exec(db, sql, callback, p, perrmsg);
if(ret != SQLITE_OK)
{
printf("SQL[%s] failure:%s\n", sql, *perrmsg);
}
return ret;
}
int main(int argc, char **argv)
{
sqlite3 *db = NULL;
int ret;
//1,打开/创建一个数据库:parking.db
ret = sqlite3_open_v2("parking.db", &db,
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
NULL);
if(ret != SQLITE_OK)
{
printf("[%d] error: %s\n", __LINE__,
sqlite3_errmsg(db));
}
// 出错信息
char *errmsg = NULL;
// 2,在数据库中,创建一张表 carinfo
// 并使得表中存放卡号、车牌号、照片路径和入场时间
char *sql = NULL;
sql = "CREATE TABLE IF NOT EXISTS carinfo(id INTEGER PRIMARY KEY,"
" licence TEXT NOT NULL,"
" time_in DEFAULT(datetime(CURRENT_TIMESTAMP, 'localtime')),"
" photo TEXT);";
// 使用API执行以上SQL语句
Sqlite3_exec(db, sql, NULL, NULL, &errmsg);
// 三秒钟插入三条新的记录
char *sql1 = "INSERT INTO carinfo(licence) VALUES('美A00911');";
Sqlite3_exec(db, sql1, NULL, NULL, &errmsg);
// 当以下函数执行失败时,该函数会让errmsg指向一条反映该错误信息的字符串,并返回(!SQLITE_OK)
Sqlite3_exec(db, "SELECT * FROM carinfo WHERE id=last_insert_rowid();", callback, NULL, &errmsg);
sleep(1);
char *sql2 = "INSERT INTO carinfo(licence) VALUES('粤B9MK48');";
Sqlite3_exec(db, sql2, NULL, NULL, &errmsg);
Sqlite3_exec(db, "SELECT * FROM carinfo WHERE id=last_insert_rowid();", callback, NULL, &errmsg);
sleep(1);
char *sql3 = "INSERT INTO carinfo(licence) VALUES('京A00001');";
Sqlite3_exec(db, sql3, NULL, NULL, &errmsg);
Sqlite3_exec(db, "SELECT * FROM carinfo WHERE id=last_insert_rowid();", callback, NULL, &errmsg);
// delete item
// 删除之前
printf("\n删除之前:\n");
int a = 1;
Sqlite3_exec(db, "SELECT * FROM carinfo ORDER BY licence;", showtable, (void *)&a, &errmsg);
char *sql4 = "DELETE FROM carinfo WHERE licence like '美%';";
char *errorMsg = NULL;
// 如果执行sql4出错了,那么会将errorMsg指向出错信息
int ok = sqlite3_exec(db, sql4, NULL, NULL, &errorMsg);
if(ok != SQLITE_OK)
{
printf("执行[%s]失败:%s\n", sql4, errorMsg);
}
// 删除之后
printf("\n删除之后:\n");
a = 1;
Sqlite3_exec(db, "SELECT * FROM carinfo ORDER BY licence;", showtable, (void *)&a, &errmsg);
// update item
char *sql5 = "UPDATE carinfo SET licence='粤B88888' WHERE licence LIKE '粤%';";
Sqlite3_exec(db, sql5, NULL, NULL, &errmsg);
printf("\n修改之后:\n");
a = 1;
Sqlite3_exec(db, "SELECT * FROM carinfo ORDER BY licence;", showtable, (void *)&a, &errmsg);
// close db
// char *sql6 = "DROP TABLE IF EXISTS carinfo;";
// Sqlite3_exec(db, sql6, NULL, NULL, &errmsg);
sqlite3_close(db);
return 0;
}
int showtable(void *arg, int argc, char **argv, char **name)
{
if(*(int*)arg == 1)
{
for(int i=0; i<argc; i++)
{
printf("%-10s\t", name[i]);
}
printf("\n-----------------------------------\n");
*(int*)arg = 0;
}
for(int i=0; i<argc; i++)
{
printf("%-10s\t", argv[i]);
}
printf("\n");
return 0;
}
以上代码源自于我学习阶段的一位老师,非本人撰写,上传仅供参考使用。