API是应用程序接口,是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。以下是重要的C语言SQLite 接口程序,可以满足在 C程序中使用 SQLite 数据库的需求。
至于API的具体了解,可以参考这篇文章:API详解
sqlite3_open(const char *filename, sqlite3 **ppDb)
const char * filename:
第一个参数是传文件名,文件名 filename 不为 NULL,那么 sqlite3_open() 将使用这个参数值尝试打开数据库文件。如果该名称的文件不存在,sqlite3_open() 将创建一个新的命名为该名称的数据库文件并打开。
sqlite3 ~~ppDb:
第二个参数让我们传一个 ~~ ppDb, ~~Db是地址的地址,因为在函数里想改变值,就必须传地址,返回的连接句柄保存在*ppDb,所以我们声明一个sqlite3 *ppDb指针,传递进去用来接收返回的句柄,把句柄理解成数据库对象的地址就好。返回值int是成果返回SQLITE_OK,也就是0,错误返回其他值。
sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)
返回值int是成果返回SQLITE_OK,也就是0,错误返回其他值。
sqlite3 * :
第一个参数是在sqlite3_open函数中返回的数据库句柄。
const char * sql:
第二个参数是执行的sql语句
sqlite_callback:
第三个参数是callback回调功能,在select获取表格数据的时候会用到
void * data:
第四个参数是用户传入的参数,可以为NULL。想传入的话一般是一串字符串,说明语句吧
char errmsg:
第五个参数是返回错误信息,注意是指针的指针。第五个参数不为空的时候,它被分配内存并写入了错误信息,所以在sqlite3_exec后面要调用sqlite3_free去释放这个对象防止内存泄露。
sqlite3_close(sqlite3*)
sqlite3 * :
第一个参数是在sqlite3_open函数中返回的数据库句柄。 即关闭数据库连接对象。
在需要查询表格数据之类的情况下是需要使用回调函数的,如果只是创建表格或者插入数据,则不需要调用回调函数。如果需要获取并且打印表格中的数据,那就需要去调用回调函数。具体工作流程也不需要详细参照了,我一般都是直接拿过来用的。这个回调函数比较固定,只需要放在那里就可。
static int callback(void *NotUsed, int argc, char **argv, char **azColName){
int i;
for(i=0; i
void * NotUsed:
第一个参数是由sqlite3_exec()传递过来的,一般都是0
int argc:
第二个参数表示表的行数(横着数)
char ** argv:
第三个参数表示表的列数(竖着数)
char ** azColName:
第四个参数是指向表头的数组指针
#include
#include
#include
#include
#include
/*回调函数*/
static int callback(void *data, int argc, char **argv, char **azColName){
int i;
for(i=0; itm_year+1900, tm_ptr->tm_mon+1, tm_ptr->tm_mday,(tm_ptr->tm_hour)+8, tm_ptr->tm_min, tm_ptr->tm_sec);
}
创建表格,插入数据,获取数据,删除数据,获取行数函数封装:
#include
#include
#include
#include
#include
#include
#include
typedef struct {
char sed_del_buf[512];
int count;
} Time;
int callback(void *data, int argc, char **argv, char **azColName);
void get_time(char *buf);
int create_table(sqlite3 *db);
int insert_data(sqlite3 *db, char *buf);
int get_data(sqlite3 *db, Time *t_tmp);
int delete_data(sqlite3 *db);
int select_count(sqlite3 *db, Time *t_tmp);
int callback2(void *NotUsed, int argc, char **argv, char **azColName);
int main(int argc, char *argv[])
{
/*计算开始时间*/
time_t stime;
time(&stime);
int start_time=stime;
printf("开始的时间是:%d s\n",start_time);
/*获取时间*/
char buf[512];
memset(buf, 0, sizeof(buf));
get_time(buf);
/*创建数据库*/
sqlite3 *db = 0;
int rc = -1;
rc = sqlite3_open("temper2.db", &db);
if(rc)
{
printf("open database failure:%s\n", strerror(errno));
return 0;
}
else
{
printf("open database success!\n");
}
/*创建表*/
create_table(db);
/*插入数据*/
insert_data(db, buf);
/*获取第一条数据*/
Time t_tmp;
get_data(db, &t_tmp);
printf("%s\n",t_tmp.sed_del_buf);
/*删除已经发送的数据*/
delete_data(db);
/*表中存在的数据数量*/
select_count(db, &t_tmp);
return 0;
}
int callback2(void *NotUsed, int argc, char **argv, char **azColName){
int i;
Time *sq_count;
sq_count = (Time *)NotUsed;
for(i=0; i<argc; i++){
sq_count->count = atoi(argv[i] ? argv[i] : "NULL");
}
printf("count:%d\n", sq_count -> count);
return 0;
}
int select_count(sqlite3 *db, Time *t_tmp)
{
int rc = -1;
char *sql_count;
sql_count = "select count(*) from temper";
rc = sqlite3_exec(db, sql_count, callback2, t_tmp, NULL);
if(rc != SQLITE_OK)
{
printf("get_data failure:%s\n",strerror(errno));
return -1;
}
else
{
return 1;
}
}
/*插入数据*/
int insert_data(sqlite3 *db, char* buf)
{
char *rt;
char *port="12345";
char *temper="31.0000摄氏度";
rt = sqlite3_mprintf("INSERT INTO temper VALUES(NULL,'%s','%s','%s')", port ,buf, temper);
int rc = sqlite3_exec(db, rt, 0, 0, NULL);
if(rc != SQLITE_OK)
{
printf("Insert data faliure:%s\n", strerror(errno));
return -1;
}
}
/*删除已经发送的数据*/
int delete_data(sqlite3 *db)
{
int rc = -1;
char *sql_delete;
sql_delete = "delete from temper limit 1";
rc = sqlite3_exec(db, sql_delete, NULL, NULL, NULL);
if(rc != SQLITE_OK)
{
printf("delete failure: %s\n", strerror(errno));
return -1;
}
}
int get_data(sqlite3 *db, Time *t_tmp)
{
int rc = -1;
char *sql_select;
sql_select = "select *from temper limit 1";
rc = sqlite3_exec(db, sql_select, callback, t_tmp, NULL);
if(rc != SQLITE_OK)
{
printf("get_data failure:%s\n",strerror(errno));
return -1;
}
else
{
return 1;
}
}
int create_table(sqlite3 *db)
{
int rc =-1;
const char * creat = "create table temper("
"ID integer primary key autoincrement,"
"DEVICE varchar(10), "
"Data varchar(500),"
"Temperature valchar(30));";
rc = sqlite3_exec(db, creat, 0, 0, NULL );
if(rc != SQLITE_OK)
{
printf("table already exit\n");
return 1;
}
else
{
printf("Create table failure:%s\n",strerror(errno));
return -1;
}
}
void get_time(char *buf)
{
struct tm *tm_ptr;
time_t the_time;
(void)time(&the_time);
tm_ptr = gmtime(&the_time);
sprintf(buf, "%02d-%02d-%02d %02d:%02d:%02d",tm_ptr->tm_year+1900, tm_ptr->tm_mon+1, tm_ptr->tm_mday,(tm_ptr->tm_hour)+8, tm_ptr->tm_min, tm_ptr->tm_sec);
}
int callback(void *data, int argc, char **argv, char **azColName){
int i;
int ofset = 0;
int rv = 0;
Time *sq_data;
sq_data = (Time*)data;
memset(sq_data -> sed_del_buf, 0, sizeof(sq_data -> sed_del_buf));
for(i=0; i<argc; i++)
{
rv = snprintf( (sq_data -> sed_del_buf) + ofset, sizeof(sq_data -> sed_del_buf) - ofset, "%s ", argv[i] ? argv[i] : "NULL");
ofset += rv;
}
}