(二)在代码中使用 sqlite3

一、相关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;
}

以上代码源自于我学习阶段的一位老师,非本人撰写,上传仅供参考使用。

猜你喜欢

转载自blog.csdn.net/qq_41985711/article/details/82982243