基于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开发板。