要使用sqlite数据库的API,需要满足两个条件:
- 安装sqlite3函数库 —— 终端输入 sudo apt-get install libsqlite3-dev
- 在程序中引入头文件 sqlite3.h —— #include <sqlite3.h>
- gcc编译时链接 sqlite3动态库 —— gcc -o sqlite3_t sqlite3_t.c -lsqlite3
目录
1、打开数据库文件 sqlite3_open
2、关闭数据库文件 sqlite3_close
3、执行sql语句 sqlite3_exec
(1) sqlite3_exec
(2) 回调函数 callback 参数解析
4、查询表格数据 sqlite3_get_table
5、总结:使用上述API实现表格的创建及增删查改
1、打开数据库文件 sqlite3_open
第一个参数 filename:数据库名称(输入型参数)。sqlite3命令创建数据库的时候,会生成一个数据库文件 xxx.db ,这里要填的就是该数据库文件的路径。
第二个参数ppDb:数据库操作句柄(输出型参数)。后续的增删查改操作都需要通过该句柄实现
返回值:成功返回 SQLITE_OK,失败返回错误码,可以使用sqlite3_errmsg函数获取错误信息。
#include <sqlite3.h>
#define DATABASE "/home/linux/myproject.db"
sqlite3* db;
if(sqlite3_open(DATABASE, &db) != SQLITE_OK){
printf("%s\n", sqlite3_errmsg(&db));
exit(1);
}
2、关闭数据库文件 sqlite3_close
参数是数据库操作句柄,如果关闭成功返回SQLITE_OK,如果数据库还处在使用状态,那就会关闭失败,此时返回 SQLITE_BUSY。
3、执行sql语句 sqlite3_exec
(1) sqlite3_exec
第一个参数 sqlite3:数据库操作句柄
第二个参数 sql:要执行的sql语句
第三个参数 callback:回调函数。只有在执行查询语句的时候,才会需要传参,其他执行语句,直接填NULL。只有在查询的时候,会返回查询结果,回调函数的参数大部分是输出型参数,用于返回查询结果。
第四个参数 args:给回调函数传递的参数。
第五个参数 errmsg:执行sql语句时产生的错误信息。
返回值:成功返回SQLITE_OK;失败返回错误码
int callback(void* arg, int ncolumns , char** f_value, char** f_name)
{}
char** errmsg;
if(sqlite3_exec(&db, "select * from project", callback, NULL, &errmsg) != SQLITE_OK)
{
printf("%s\n", errmsg);
}
(2) 回调函数 callback 参数解析
在查询的过程中,每查询到一条记录就会通过回调函数返回,而不是查询到所有数据再一起返回
int callback(void* arg, int ncolumns , char** f_value, char** f_name);
第一个参数 arg:sqlite_exec传递过来的参数
第二个参数 ncolumns:列数
第三个参数 f_value:某一个字段的所有内容
第四个参数 f_name:字段名称
4、查询表格数据 sqlite3_get_table
除了使用 sqlite3_exec 来查询表格内容外,还可以使用 sqlite3_get_table 来直接获取到表格内容,该函数无需传入回调函数。
第一个参数 db:数据库操作句柄
第二个参数 zSql:要执行的sql语句
第三个参数 pazResult:查询到的表格数据。该指针指向的空间是动态开辟的,使用完以后,我们需要使用 sqlite3_free_table 来释放这块空间。
第四个参数 pnRow:查询结果的行数。即有多少条记录
第五个参数 pnColumn:查询结果的列数。即每一条记录有多少个字段
第六个参数 pzErrmsg:执行语句时产生的错误信息
返回值:成功返回SQLITE_OK;失败返回错误码
如果表格内容如下:
那么结果返回的内容如下:
5、总结:使用上述API实现表格的创建及增删查改
#include <stdio.h>
#include <unistd.h>
#include <sqlite3.h>
#define DATABASE "/home/linux/myproject.db"
int main(){
sqlite3* db;
// 1.打开数据库文件
if(sqlite3_open(DATABASE, &db) != SQLITE_OK){
printf("%s\n",(char*)sqlite3_errmsg(db));
return 1;
}
// 2.新建一个表格
char** errmsg;
const char* sql = "drop table if exists project;\
create table project(id integer, device char, code integer);";
if(sqlite3_exec(db, sql, NULL, NULL, errmsg) != SQLITE_OK)
{
printf("%s\n", *errmsg);
return 1;
}
// 3.插入一条记录
sql = "insert into project values(1, '冰箱', 1001);";
if(sqlite3_exec(db, sql, NULL, NULL, errmsg) != SQLITE_OK)
{
printf("%s\n", *errmsg);
}
// 4.修改记录
sql = "update project set device='电饭煲' where id=1;";
if(sqlite3_exec(db, sql, NULL, NULL, errmsg) != SQLITE_OK)
{
printf("%s\n", *errmsg);
}
// 5.查询记录
sql = "select * from project;";
char** sqlRes;
int nRows;
int nColumns;
int i, j;
if(sqlite3_get_table(db, sql, &sqlRes, &nRows, &nColumns, errmsg)==SQLITE_OK)
{
for(i = 0; i <= nRows; i++)
{
for(j = 0; j < nColumns; j++)
{
printf("%-11s", sqlRes[i*nColumns + j]);
}
printf("\n");
}
}
// 6.删除一条记录
sql = "delete from project where id=1;";
if(sqlite3_exec(db, sql, NULL, NULL, errmsg) != SQLITE_OK)
{
printf("%s\n", *errmsg);
}
// 关闭数据库文件
sqlite3_close(db);
return 0;
}