基于Linux下sqlite3的使用

基于Linux下sqlite3的使用


为什么要使用sqlite3

关于数据库大部分人都是使用mysql但是linux对mysql的使用相对于sqlite3来说还是较少,大部分都是使用sqlite3居多,因为sqlite提供了一些C函数接口,通过向这些接口传入标准的sql语句可操作数据库。sqlite3 *类型是sqlite3编程中最重要的数据类型,它贯穿数据库操作的始末。从数据库打开开始,sqlite就要为这个类型准备内存空间,直到数据库关闭。下面是对sqlite3的增、删、改、查的应用讲解 。


提示:以下是本篇文章正文内容,下面案例可供参考

一、sqlite3常用函数

int sqlite3_open(const char *filename, sqlite3 **ppdb); 
int sqlite3_close(sqlite3 *db);
int sqlite3_exec(sqlite3 *db, const char *sql, int (*sqlite3_callback)(void *,int, char**,char**), void *, char **errmsg);
char *sqlite3_mprintf(const char*, va_list);
int sqlite3_free(char *);
int sqlite3_get_table(sqlite3 *, const char *sql, char **resultp, int *nrow, int *ncolumn, char **errmsg);
void sqlite3_free_table(char **resultp);

1.sqlite3_open (打开/创建数据库)

int sqlite3_open(const char * filename, sqlite3 **ppDb);

int sqlite3_open(
  const char *filename,   /* 数据库的名称*/
  sqlite3 **ppDb          /* 数据库的句柄 */
);
用这个函数开始数据库操作。需要传入两个参数,一是数据库文件名,文件名不需要一定存在,如果文件不存在,sqlite会自动建立它。如果它存在,就尝试把它当数据库文件来打开。sqlite3**,即前面提到的关键数据结构。这个结构底层细节如何,不需要管它。函数返回值表示操作是否正确,如果是SQLITE_OK则表示操作正常。相关的返回值sqlite定义了一些宏。具体这些宏的含义可以参考sqlite3.h 文件。

2.sqlite3_close(关闭数据库函数接口)

int int sqlite3_close(sqlite3**ppDb);

ppDb为使用sqlite3_open()函数打开的数据库的句柄。

3.sqlite3_exec(执行sql语句函数接口)

int sqlite3_exec(sqlite3*,const char*sql,sqlite_callback,void*data,char**errmsg);

int sqlite3_exec(
  sqlite3*,                     /* 数据库的句柄 */
  const char *sql,              /* SQL的语句*/
  sqlite_callback,              /* 回调函数 */
  void *,                       /* 回调函数的第一个传参*/
  char **errmsg                 /* 错误信息 */
);

4.sqlite3_mprintf(将结果存放于内存中)

char *sqlite3_mprintf(const char*,...);

sqlite3_mprintf()的作用是将结果写入到sqlite3_malloc()获取的内存中,
例程返回的字符串应该使用sqlite3_free()进行释放,如果无法申请到足够的内存,则会返回NULL指针;
它同c库函数 sprintf()类似,实现一些额外的格式化。对所有常用的printf()格式化选项都适用。
另外还有非常用选项:%q, %Q, %z;%q选项的作用类似于%s,它会替换了参数列表中以空字符结尾的字符串%q,
同时他会将单引号字符转义,有助于防止SQL注入攻击;

5.sqlite3_free(释放内存数据)

int sqlite3_free(char *);

6.sqlite3_get_table(查询数据)

int sqlite3_get_table(sqlite3 *, const char *sql, char **resultp, int *nrow, int *ncolumn, char **errmsg);

int sqlite3_get_table(
  sqlite3 *db,          /* 数据库句柄 */
  const char *zSql,     /* SQL语句*/
  char ***pazResult,    /* 结果*/
  int *pnRow,           /* 行数 */
  int *pnColumn,        /* 列数 */
  char **pzErrmsg       /* 错误信息*/
);
pazResult返回的字符串数量实际上是(*pnRow+1)*(*pnColumn),因为前(*pnColumn)个是字段名。

7.sqlite3_free_table(释放内存数据)

void sqlite3_free_table(char **result);

二、sqlite3的使用

1.创建数据库

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

int main(void)  
{  
	sqlite3 *db=NULL;  
	char *zErrMsg = 0;  
	int ret;  

	//打开指定的数据库文件,如果不存在将创建一个同名的数据库文件  
	ret = sqlite3_open("sqldata.db", &db);  
	if(ret)  
	{  
		fprintf(stderr, "Open ERROR !!! ERRMSG : /n %s/n", sqlite3_errmsg(db));  
		sqlite3_close(db);  
		exit(1);  
	}
	else 
	{
		printf("Open success !!!  /n");  
	}

	sqlite3_close(db); //关闭数据库  
	return 0;  
}  

执行结果
在这里插入图片描述

1.增

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

int main(void)  
{  
	sqlite3 *db=NULL;  
	char *zErrMsg = 0;  
	int ret;  

	//打开指定的数据库文件,如果不存在将创建一个同名的数据库文件  
	ret = sqlite3_open("sqldata.db", &db);  
	if(ret)  
	{  
		fprintf(stderr, "Open ERROR !!! ERRMSG : \n %s\n", sqlite3_errmsg(db));  
		sqlite3_close(db);  
		exit(1);  
	}
	else 
	{
		printf("Open success !!!  \n");  
	}
	


	char *sql = "CREATE TABLE SensorData( \
	ID INTEGER PRIMARY KEY,\
	SensorID INTEGER,\
	SiteNum INTEGER,\
	Time VARCHAR(12),\
	SensorParameter REAL\
	);";  
	
	ret = sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );  
	if(ret)
	{
		printf("zErrMsg = %s\n",zErrMsg);
	}
			  
	//插入数据  
	char* sql1 = "INSERT INTO \"SensorData\" VALUES( NULL , 1 , 1 , '200605011206', 18.9 );" ;  
	ret = sqlite3_exec( db , sql1 , 0 , 0 , &zErrMsg ); 
	
	if(ret)
	{
		printf("zErrMsg = %s\n",zErrMsg);
	}
	char* sql2 = "INSERT INTO \"SensorData\" VALUES( NULL , 1 , 1 , '200605011306', 16.4 );" ;  
	ret = sqlite3_exec( db , sql2 , 0 , 0 , &zErrMsg );  	
	
	if(ret)
	{
		printf("zErrMsg = %s\n",zErrMsg);
	}

	sqlite3_close(db); //关闭数据库  
	return 0;  
}  

执行结果
在这里插入图片描述

2.删

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

int main(void)  
{  
	sqlite3 *db=NULL;  
	char *zErrMsg = 0;  
	int ret;  

	//打开指定的数据库文件,如果不存在将创建一个同名的数据库文件  
	ret = sqlite3_open("sqldata.db", &db);  
	if(ret)  
	{  
		fprintf(stderr, "Open ERROR !!! ERRMSG : \n %s\n", sqlite3_errmsg(db));  
		sqlite3_close(db);  
		exit(1);  
	}
	else 
	{
		printf("Open success !!!  \n");  
	}
	


	char *sql = "CREATE TABLE SensorData( \
	ID INTEGER PRIMARY KEY,\
	SensorID INTEGER,\
	SiteNum INTEGER,\
	Time VARCHAR(12),\
	SensorParameter REAL\
	);";  
	
	ret = sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );  
	if(ret)
	{
		printf("zErrMsg = %s\n",zErrMsg);
	}
			  
	//插入数据  
	char* sql1 = "INSERT INTO \"SensorData\" VALUES( NULL , 1 , 1 , '123', 18.9 );" ;  
	ret = sqlite3_exec( db , sql1 , 0 , 0 , &zErrMsg ); 
	
	if(ret)
	{
		printf("zErrMsg = %s\n",zErrMsg);
	}
	char* sql2 = "INSERT INTO \"SensorData\" VALUES( NULL , 2 , 1 , '456', 16.4 );" ;  
	ret = sqlite3_exec( db , sql2 , 0 , 0 , &zErrMsg );  	
	
	if(ret)
	{
		printf("zErrMsg = %s\n",zErrMsg);
	}
	
	char* sql3 = "INSERT INTO \"SensorData\" VALUES( NULL , 3 , 1 , '678', 16.4 );" ;  
	ret = sqlite3_exec( db , sql2 , 0 , 0 , &zErrMsg );  	
	
	if(ret)
	{
		printf("zErrMsg = %s\n",zErrMsg);
	}
	int nrow = 0, ncolumn = 0,index = 0;  
	char **azResult; //二维数组存放结果 
	sql = "SELECT * FROM SensorData ";  
	sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );  
	index = ncolumn;
    for(int i = 0; i < nrow; i++)
    {
        printf("第%d行记录\n", i+1);
        for(int j = 0; j < ncolumn; j++)
        {
			printf("%s >> %s\n", azResult[j], azResult[index]);	
            index++;
        }
	}
	
	//删除数据  
	sql = "DELETE FROM SensorData WHERE SensorID = 1 ;" ;  
	ret = sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );  
 	if(ret)
	{
		printf("zErrMsg = %s\n",zErrMsg);
	}
	
	printf("==================\n删除后数据为\n==================\n");
	sql = "SELECT * FROM SensorData ";  
	sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );  
	index = ncolumn;
    for(int i = 0; i < nrow; i++)
    {
        printf("第%d行记录\n", i+1);
        for(int j = 0; j < ncolumn; j++)
        {
			printf("%s >> %s\n", azResult[j], azResult[index]);	
            index++;
        }
	}
	sqlite3_close(db); //关闭数据库  
	return 0;  
}  

执行结果
在这里插入图片描述

3.改

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

int main(void)  
{  
	sqlite3 *db=NULL;  
	char *zErrMsg = 0;  
	int ret;  

	//打开指定的数据库文件,如果不存在将创建一个同名的数据库文件  
	ret = sqlite3_open("sqldata.db", &db);  
	if(ret)  
	{  
		fprintf(stderr, "Open ERROR !!! ERRMSG : \n %s\n", sqlite3_errmsg(db));  
		sqlite3_close(db);  
		exit(1);  
	}
	else 
	{
		printf("Open success !!!  \n");  
	}
	


	char *sql = "CREATE TABLE SensorData( \
	ID INTEGER PRIMARY KEY,\
	SensorID INTEGER,\
	SiteNum INTEGER,\
	Time VARCHAR(12),\
	SensorParameter REAL\
	);";  
	
	ret = sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );  
	if(ret)
	{
		printf("zErrMsg = %s\n",zErrMsg);
	}
			  
	//插入数据  
	char* sql1 = "INSERT INTO \"SensorData\" VALUES( NULL , 1 , 1 , '123', 18.9 );" ;  
	ret = sqlite3_exec( db , sql1 , 0 , 0 , &zErrMsg ); 
	
	if(ret)
	{
		printf("zErrMsg = %s\n",zErrMsg);
	}
	char* sql2 = "INSERT INTO \"SensorData\" VALUES( NULL , 2 , 1 , '456', 16.4 );" ;  
	ret = sqlite3_exec( db , sql2 , 0 , 0 , &zErrMsg );  	
	
	if(ret)
	{
		printf("zErrMsg = %s\n",zErrMsg);
	}
	
	char* sql3 = "INSERT INTO \"SensorData\" VALUES( NULL , 3 , 1 , '678', 16.4 );" ;  
	ret = sqlite3_exec( db , sql2 , 0 , 0 , &zErrMsg );  	
	
	if(ret)
	{
		printf("zErrMsg = %s\n",zErrMsg);
	}
	int nrow = 0, ncolumn = 0,index = 0;  
	char **azResult; //二维数组存放结果 
	sql = "SELECT * FROM SensorData ";  
	sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );  
	index = ncolumn;
    for(int i = 0; i < nrow; i++)
    {
        printf("第%d行记录\n", i+1);
        for(int j = 0; j < ncolumn; j++)
        {
			printf("%s >> %s\n", azResult[j], azResult[index]);	
            index++;
        }
	}
	
	sql = "UPDATE  SensorData SET SiteNum = 10 WHERE SensorID = 1;" ;  
	ret = sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );  
 	if(ret)
	{
		printf("zErrMsg = %s\n",zErrMsg);
	}
	
	printf("==================\n修改后的数据\n==================\n");
	sql = "SELECT * FROM SensorData ";  
	sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );  
	index = ncolumn;
    for(int i = 0; i < nrow; i++)
    {
        printf("第%d行记录\n", i+1);
        for(int j = 0; j < ncolumn; j++)
        {
			printf("%s >> %s\n", azResult[j], azResult[index]);	
            index++;
        }
	}

	sqlite3_close(db); //关闭数据库  
	return 0;  
}  

执行结果
在这里插入图片描述

4.查

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

int main(void)  
{  
	sqlite3 *db=NULL;  
	char *zErrMsg = 0;  
	int ret;  

	//打开指定的数据库文件,如果不存在将创建一个同名的数据库文件  
	ret = sqlite3_open("sqldata.db", &db);  
	if(ret)  
	{  
		fprintf(stderr, "Open ERROR !!! ERRMSG : \n %s\n", sqlite3_errmsg(db));  
		sqlite3_close(db);  
		exit(1);  
	}
	else 
	{
		printf("Open success !!!  \n");  
	}
	


	char *sql = "CREATE TABLE SensorData( \
	ID INTEGER PRIMARY KEY,\
	SensorID INTEGER,\
	SiteNum INTEGER,\
	Time VARCHAR(12),\
	SensorParameter REAL\
	);";  
	
	ret = sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );  
	if(ret)
	{
		printf("zErrMsg = %s\n",zErrMsg);
	}
			  
	//插入数据  
	char* sql1 = "INSERT INTO \"SensorData\" VALUES( NULL , 1 , 1 , '123', 18.9 );" ;  
	ret = sqlite3_exec( db , sql1 , 0 , 0 , &zErrMsg ); 
	
	if(ret)
	{
		printf("zErrMsg = %s\n",zErrMsg);
	}
	char* sql2 = "INSERT INTO \"SensorData\" VALUES( NULL , 2 , 1 , '456', 16.4 );" ;  
	ret = sqlite3_exec( db , sql2 , 0 , 0 , &zErrMsg );  	
	
	if(ret)
	{
		printf("zErrMsg = %s\n",zErrMsg);
	}
	
	char* sql3 = "INSERT INTO \"SensorData\" VALUES( NULL , 3 , 1 , '678', 16.4 );" ;  
	ret = sqlite3_exec( db , sql2 , 0 , 0 , &zErrMsg );  	
	
	if(ret)
	{
		printf("zErrMsg = %s\n",zErrMsg);
	}
	int nrow = 0, ncolumn = 0,index = 0;  
	char **azResult; //二维数组存放结果 
	sql = "SELECT * FROM SensorData ";  
	sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );  
	index = ncolumn;
	printf("==================\n查询结果\n==================\n");
    for(int i = 0; i < nrow; i++)
    {
        printf("第%d行记录\n", i+1);
        for(int j = 0; j < ncolumn; j++)
        {
			printf("%s >> %s\n", azResult[j], azResult[index]);	
            index++;
        }
	}

	sqlite3_close(db); //关闭数据库  
	return 0;  
}  

执行结果
在这里插入图片描述

总结

总体来说sqlite3使用较为方便快捷,简单的套用函数即可使用,其余功能还需一起挖掘,期待你的反馈。
下篇介绍基于Linux平台下移植sqlite3至ARM开发板。

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Linux QtSqlite加密是指在Linux系统使用QtSqlite库对数据库进行加密处理的过程。QtSqlite是基于SQLite的C++库,用于在Qt框架下操作数据库。SQLite是一种轻型、嵌入式的数据库引擎,广泛用于各种应用程序的数据存储和管理。 要在Linux使用QtSqlite加密功能,可以借助Qt提供的QtCipherSqlitePlugin插件。QtCipherSqlitePlugin是一个用于对SQLite数据库进行加密和解密的插件,它可以在数据库打开和关闭的过程中对数据进行加密和解密操作,保护数据库的机密性。 使用QtCipherSqlitePlugin进行加密时,先需要在Qt应用程序中加载该插件,并将其注册到数据库驱动中。然后,可以通过设置数据库的加密密钥和算法类型来指定加密方式。常见的加密算法包括AES和DES等。 加密后的数据库文件在存储和传输过程中更加安全,无法直接被读取和修改。在使用数据库时,需要提供正确的密钥才能解密数据进行操作。而没有密钥的人则无法对数据库进行读写操作,保证了数据的机密性和安全性。 总而言之,Linux QtSqlite加密和QtCipherSqlitePlugin的使用可以有效保护数据库的安全。通过对数据库进行加密处理,可以防止敏感数据的泄漏和篡改,为应用程序和用户提供更高的数据安全保障。 ### 回答2: Linux QtSQLITE加密是指在Linux操作系统使用QtSQLITE库进行数据库操作时,对数据库进行加密的过程。QtSQLITE是一个用于在Qt应用程序中访问和操作SQLite数据库的插件。 QtCipherSQLitePlugin是一个在Qt应用程序中使用SQLite数据库加密插件。它提供了一种轻松而安全的方法来对SQLite数据库进行加密和解密操作。使用QtCipherSQLitePlugin,我们可以通过在连接到数据库之前设置加密密钥来保护数据库中的数据。这样,即使数据库文件被非法访问,也无法获取到其中的明文数据。 要使用QtCipherSQLitePlugin,首先需要在项目中添加相应的插件文件,并在代码中进行相关设置。然后,我们可以在代码中使用QtSQLITE库提供的API进行数据库操作,如创建表、插入数据、查询数据等。在连接到数据库之前,我们可以通过使用QtCipherSQLitePlugin提供的接口设置加密密钥,以保护数据库中的数据。 使用Linux QtSQLITE加密和QtCipherSQLitePlugin可以有效地保护数据库中的敏感数据。通过加密数据库,即使数据库文件被非法获取,也无法直接获取到其中的明文数据。这样可以提高数据的安全性,并保护用户的隐私。 总结来说,Linux QtSQLITE加密和QtCipherSQLitePlugin是一种用于在Linux操作系统使用QtSQLITE库对SQLite数据库进行加密的解决方案。它提供了一种简单而安全的方法来保护数据库的数据,加强数据的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jine_GG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值