1.安装数据库
Linux 下安装sqlite3 需要两个个命令 即可:
(1)sudo apt-get install sqlite
(2)apt-get install libsqlite3-dev
2.相关函数
1. sqlite3_open 用来打开一个数据库
#include <sqlite3.h>
int sqlite3_open(const char *dbname, sqlite3 **db)
第一个参数dbname:数据库的名称
第二个参数 db:数据库的句柄
2.sqlite3_close 关闭一个数据库
int sqlite3_close(sqlite3 *db)
3.sqlite3_exec 用来执行sqlite3 语句
int sqlite_exec(sqlite *db, const char *sql,int (* callback)(void *int, char **, char **),void *, char **errmsg);
第一个参数db:与之前相同;
第二个参数sql:SQL语句;以\0结尾。
第三个参数callback:回调函数;当这条语句执行之后,sqlite3会去调用你提供的这个函数。通常设为NULL。
第四个参数void*是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。
第五个参数char** errmsg 是错误信息。
说明:通常,sqlite3_callback和它后面的void*这两个位置都可以填NULL。填NULL表示你不需要回调。比如你做insert 操作,做delete操作,就没有必要使用回调。而当你做select 时,就要使用回调,因为sqlite3 把数据查出来,得通过回调告诉你查出了什么数据。虽然回调显得代码整齐,但有时候你还是想要非回调的select
查询。这可以通过sqlite3_get_table 函数做到。
4.sqlte3_get_table 执行sql的查询功能
在int sqlite3_get_table(sqlite3 *db, const char *zSql,char **pazResult, int *pnRow,int *pnColumn);
第一个参数db:数据库句柄
第二个参数zSql:sqlite3的语句,跟sqlite3_exec 里的sql 是一样的。是一个很普通的以\0结尾的char*字符串。
第三个参数pazResult:查询的结果,它依然一维数组(不要以为是二维数组,更不要以为是三维数组)。它内存布局是:字段名称,后面是紧接着是每个字段值。
第四个参数pnRow:结果集的列数,即查出多少行
第五个参数errmsg:错误信息
注意:如果提供了errmsg,用来创建错误消息的内存是在堆上分布的。 故在调用后,应该检查一下是否为null值,如果有错误发生,使用sqlite3_free()释放errmsg占用的内存。
3.代码实例
3.1创建一个数据库
#include <stdio.h>
#include <string.h>
#include <sqlite3.h>
#include <errno.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
sqlite3 *db=NULL;
int rc = -1;
}
//打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
rc = sqlite3_open("yjntest.db", &db);
if( rc < 0 )
{
printf("Can't open(creat) database: %s\n", sqlite3_errmsg(db));
exit(1);
}
else
{
printf("You have opened a sqlite3 database named yjntest .db successfully!\n");
sqlite3_close(db); //关闭数据库
return 0;
}
}
编写好后我们开始运行
当我们再次查看当前目录时,可以发现多一个我们命名的数据库。
需要注意的时在编译时需要在末尾加上一个 -lsqlite3,不然会抛错。
3.2插入数据
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "sqlite3.h"
#include <errno.h>
int main( int argc, char **argv )
{
sqlite3 *db=NULL;
char *zErrMsg = 0;
int rc;
char *sql;
rc = sqlite3_open("yjntest.db", &db);//打开指定的数据库文件,如果不存在将创建一个同
名的数据库文件
if( rc )
{
printf( "Can't open database: %s\n", sqlite3_errmsg(db));
exit(1);
}
else
{
printf("You have opened a sqlite3 database named yjntest.dbsuccessfully!\n");
}
//利用sql语句创建一个表,如果该表存在,则不创建,并给出提示信息,存储在 zErrMsg 中。
sql = " CREATE TABLE SensorData("\
"ID number,"\
"name,"\
"birthday,"\
"telephone,"\
"age );" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
//添加数据
sql = "INSERT INTO SensorData VALUES('1' , 'yang' ,' 1.1' ,'12580', '18' );" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
sql = "INSERT INTO SensorData VALUES( '2', 'jia' , '2.2' ,'10086', '16' );" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
printf("Insert successfully!\n");
sqlite3_close(db); //关闭数据库
return 0;
}
运行之后我们通过命令:sqlite3 yjntest.db
进入我们创建的数据库中,在执行命令:select * from sesordata(你创建的表的名称)就可以看到刚刚我们所添加的信息。
3.3查看表的内容
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sqlite3.h>
//查询数据
/*int sqlite3_get_table(sqlite3*, const char *sql,char***result , int *nrow , int *ncolumn ,char **errmsg );
result中是以数组的形式存放你所查询的数据,首先是表名,再是数据。
nrow ,ncolumn分别为查询语句返回的结果集的行数,列数,没有查到结果时返回0
*/
int main(int argc, char **argv)
{
sqlite3 *db=NULL;
int rc;
char *sql;
int nrow=0, ncolumn=0;
char **azResult;
char *zErrMsg = 0; //二维数组存放数据
rc = sqlite3_open("yjntest.db", &db);//打开指定的数据库文件,如果不存在将创建一>个同名的数据库文件
if( rc )
{
printf( "Can't open database: %s\n", sqlite3_errmsg(db));
exit(1);
}
printf("You have opened a sqlite3 database named yjntest.db successfully!\n");
sql = "SELECT * FROM SensorData ";
rc = sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
if(rc == 0)
{
printf( "row:%d column=%d\n" , nrow , ncolumn );
printf( "The result of querying is :\n" );
int i=0,j=0;
for( i=1 ; i<( nrow + 1 )* ncolumn ; i++ )
{
printf("%s ",azResult[i*ncolumn+j]);
printf("\n");
}
}
}
else if( rc )
{
printf("SQL error!:%s\n",zErrMsg);//打印错误信息
sqlite3_free(zErrMsg);//释放掉 azResult 的内存空间
}
sqlite3_close(db); //关闭数据库
return 0;
}
运行后我们可以直接看到我们之前存入的数据
3.4删除数据
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sqlite3.h>
int main(int argc, char **argv)
{
sqlite3 *db;
int rc;
char *sql;
char *zErrMsg= 0; //获取错误信息
char *data;
rc = sqlite3_open("yjntest.db",&db);//打开数据库
if( rc )
{
printf("Can't open database!:%s\n",sqlite3_errmsg(db));
exit(0);
}
printf("You have opened a sqlite3 database named yjntest.db successfully!\n");
//制作sql语句
sql = "delete from SensorData"; //删除表中所有数据
//删除某个特定的数据
/*sql="delete from SensorData where ID number = 1 ;";
sqlite3_exec( db , sql , NULL , NULL , &zErrMsg );
*/
rc = sqlite3_exec(db,sql,NULL,(void *)data,&zErrMsg);
if(rc)
{
printf("SQL error!:%s\n",zErrMsg);//打印错误信息
sqlite3_free(zErrMsg);//释放掉 azResult 的内存空间
}
else
{
printf("delete recodes successfully!\n");
}
sqlite3_close(db);//关闭数据库
return 0;
}
运行之后我们再进入到之前创建的数据库中
我们可以看到表中已经没有数据。