【MQTT】在Linux下sqlite3的使用

安装sqlite3

我们从下载页面,SQLi官网从源代码区下载
然后在Linux下安装sqlite3

#下载
wget https://www.sqlite.org/2020/sqlite-autoconf-3310100.tar.gz
#解压
tar -xzvf sqlite-autoconf-3310100.tar.gz

sqlite3库函数

1. 打开/创建数据库

int sqlite3_open(const char *dbname,sqlite3 **db)
参数说明:
第一个参数dbname是数据库的名称;
第二个参数db是用于保存打开的数据库文件dbname的信息。

2. 关闭数据库

int sqlite3_close(sqlite3  *db)
参数说明:db需要关闭的数据库文件。

3. 执行sqlite3语句

int sqlite_exec(sqlite  *db, const char *sql, int (*callback)(void *int,char **,char **),void *,char **errmsg);

参数说明:
第一个参数:db是用于保存打开的数据库文件dbname的信息;
第二个参数:sql你要执行命令的语句;
第三个参数:callback回调函数,当这条语句执行之后,sqlite3会去调用你提供的这个函数。通常设为NULL;
第四个参数:void *是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。
第五个参数:是错误信息。

说明:说明:通常,sqlite3_callback和它后面的void*这两个位置都可以填NULL。填NULL表示你不需要回调。比如你做insert 操作,做delete操作,就没有必要使用回调。而当你做select 时,就要使用回调,因为sqlite3 把数据查出来,得通过回调告诉你查出了什么数据。虽然回调显得代码整齐,但有时候你还是想要非回调的select查询。这可以通过sqlite3_get_table 函数做到。

4. 执行sqlite3的查询功能

int sqlite3_get_table(sqlite3 *db, const char *zsql,char ***pazResult, int *nrow, int *ncolumn,char **zErrmsg);

参数说明:
第一个参数db:db是用于保存打开的数据库文件dbname的信息;
第二个参数:sqlite3的语句,跟sqlite3_exec里的sql是一样的,是一个很普通的以\0结尾的char *字符串。
第三个参数:查询的结果,它依然是一维数组,他的内存布局时:字段名称,后面时紧接着是每个字段值。
第四个参数:是查询出多少条记录(即查出是多少行,不包括字段名那行)
第五个参数:是多少个字段(多少列)
第六个参数:是错误信息

注意:如果提供了errmsg,用来创建错误消息的内存是在堆上分布的,故在调用后,应该检查一下是否为null值,如果有错误发生,使用sqlite3_free()释放errmsg占用的内存。

代码实现

#include <stdio.h>
#include "sqlite3.h"
   

int db_init(sqlite3  *db,char *zErrMsg)
{
    int         len;

	//调用sqlite3_open(),打开.db数据库文件。若没有,则创建
 	len = sqlite3_open("temper.db",&db); 
	if (len != SQLITE_OK)	
 	{
	    printf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
	  	sqlite3_close(db);
  	    exit(1);
	} 
 	else
 	{
	    printf("You have opened a sqlite3 database named temper.db successfully!\n");
	}
} 

int db_table(char *zErrMsg, sqlite3 *db)
{
    int			ret;
	//创建表 如果表已存在,则无需创建;否则创建一个新表
	char        *sql = "create table if not exists temperature(ipaddr char(30), datetime char(50), temperature  char(30))";		
	
	datasql = sqlite3_exec(db,sql,0,0,&zErrMsg);
    if(datasql != SQLITE_OK)
    {
        sqlite3_close(db);
        printf("Creat table failure \n");
        return 0;
    }
    printf("Table created successfully!\n");
    printf("Now ready to connect the client and recive message from client...\n");
    printf("\n");
    sqlite3_close(db);
}

int db_store(sqlite3 *db,char *zErrMsg)
{
    char        sql1[128];
    int         ret;
 
	snprintf(sql1, 128, "insert into temperature values('%s', '%s', '%f');", ipaddr, datetime, temper);
                             
    //保证了数组sql1的内容为字符串
    sql1[127] = '\0';		
    printf("%s\n", sql1);
    
    //调用sqlite3_exec();将数据存储至temperature表中
    ret = sqlite3_exec(db, sql1, 0 , 0, &zErrMsg);
    if (ret != SQLITE_OK)		//判断返回值,如果不等于SQLITE_OK,即插入记录失败
    {
    	sqlite3_close(db);
        printf("insert data failure:%s!\n", zErrMsg);
        return 0;
	}
    printf("insert data successfully!\n");
    sqlite3_close(db);
}

posted @ 2022-09-25 19:39  西故黄鹤楼  阅读(90)  评论(0编辑  收藏  举报