SQLite3的API调用实战例子
目录
SQLite3的API调用实战例子
一、SQLite3与Excel的对比理解
1、创建数据
2、创建表单
3、插入数据
4、其他操作
二、SQLiet3的命令控制
三、C++代码实操控制
1、文件列表:
2、工程管理文件:Makefile
3、源代码
4、编译代码
5、运行测试
SQLite3的API调用实战例子
一、SQLite3与Excel的对比理解
理解sqlite3的使用其实非常简单,这里Excel大家都会吧!这里sqlite3的使用和Excel非常相似。
1、创建数据
在sqlite中使用命令sqlite3 person.db新建一个数据库相当于新建一个Excel表格
2、创建表单
在sqlite中使用命令create table teacher(name text not null, age tinyint not null, jobNumber int not null, salary int primary key);创建一个sqlite表单相当于在Excel表格中新建一个teacher的标签项页并且这个表格有name,age,jobNumber,salary行。
3、插入数据
在sqlite中使用命令insert into teacher values("王老师", 25, 12345, 3000);插入对应数据相当于在Excel中写入相应的数据。
4、其他操作
在sqlite中删除、展示和改数据都相应输入相应的命令。参考下面命令哈!
总结:这里sqlite3的使用和excle的使用十分的相似,首先我们创建一个数据库就相当于创建一个excle表格,其次我们创建一个sqlite表单就相当于创建一个excle标签然后定义里面每一列存储的数据,最后想添加、删除、更改、查找等操作我们的sqlite使用的是命令行而excle使用的之间修改表格数据。
二、SQLiet3的命令控制
在敲相应的命令时还是参考之前我们所写的SQLite3数据库的使用:https://blog.csdn.net/2403_82436914/article/details/147003431?spm=1001.2014.3001.5502这个里面我们介绍了怎么在ubuntu上安装部署sqlite和sqlite命令行操作C/C++调用和Qt调用,我们下面也总结了相应的命令以供参考。
我们会发现使用命令创建一个数据库和数据的填写时需要敲大量的命令,如下
#创建sqlite数据库
sqlite3 person.db
#创建teacher表单
create table teacher(
name text not null,
age tinyint not null,
jobNumber int not null,
salary int primary key);
#查看创建的teacher表单
.dump teacher #或.table
#添加数据
insert into teacher values("王老师", 25, 12345, 3000);
insert into teacher values("李老师", 24, 12346, 4000);
#显示所有数据
select * from teacher;
#删除数据
delete from teacher where name = '李老师';
#改数据
update teacher set age = 21 where name = '王老师';
#查数据
select * from teacher where name like '李%';
#删除表单
drop table teacher;
#退出数据库
.exit
这里使用命令行操作sqlite很繁琐,还有敲错命令的问题等等。
三、C++代码实操控制
在进行C++代码编写时我们要确保已经安装了sqlite,并且sqlite命令行能够正常的增删改查。我们的代码有如下:
1、文件列表:
2、工程管理文件:Makefile
#Makefile SQlite
OBJ = data.o main.o
CXX = g++
GW = -g -Wall
SQ = -lsqlite3
main: $(OBJ)$(CXX) -o $@ $(OBJ) $(GW) $(SQ)
data.o: data.cpp data.h$(CXX) -c $< $(GW) $(SQ)
main.o: main.cpp data.h$(CXX) -c $< $(GW) $(SQ)
clean:rm -r *.orm *.dbrm main
这里我们使用Makefile进行工程管理,当然您也可以使用cmake进行工程管理。这里需要注意的是我们必须要加-lsqlite3的依赖。
3、源代码
源代码特别多,主要做的就是使用C++调用sqlite提供的API接口实现对sqlite数据库(准确的来说是数据库里的列表)的增删改查等操作,这里我们都加了注释,有兴趣可以了解了解,您也可以直接去看官网https://www.sqlite.org/cintro.html的API调用接口。
data.h
#ifndef __SQLITE_H__
#define __SQLITE_H__
#include <iostream>
#include <cstdio>
#include <sqlite3.h>
#include <cstdlib>
using namespace std;
//功能: 创建或打开数据库
//参数:database:数据库名字,db:数据库指针
//返回值:成功返回0, 失败返回-1
int open_sqlite(const string & database, sqlite3 **db);
//功能:创建sqlite列表
//参数:db数据库指针
//返回值:成功返回0, 失败返回-1
int create_table(sqlite3 *db);
//功能:向数据库列表中插入数据
//参数:db数据库指针
//返回值:成功返回0, 失败返回-1
int insert_into(sqlite3 *db);
//功能:删除数据库列表中的数据
//参数:db数据库指针
//返回值:成功返回0, 失败返回-1
int delete_from(sqlite3 *db);
//功能:更新数据库列表里面的数据
//参数:db数据库指针
//返回值:成功返回0, 失败返回-1
int update_set(sqlite3 *db);
//功能:查找列表中某行数据
//参数:db数据库指针
//返回值:成功返回0, 失败返回-1
int select_from(sqlite3 *db);
//功能: 显示数据库列表中的所有数据
//参数:db数据库指针
//返回值:成功返回0, 失败返回-1
int show_table(sqlite3 *db);
//功能:推出数据库
//参数:db数据库指针
//返回值:成功返回0, 失败返回-1
int close_sqlite(sqlite3 *db);
//功能: 回调显示函数
//参数:data:数据库指针,argc:该行的列数,
//argv:该行各列的字符串,colname:对应的列名的字符串数组
//返回值:成功返回0;
int callback(void *data, int argc, char **argv, char **aColName);
#endif
data.cpp
#include "data.h"
//功能: 创建或打开数据库
//参数:database:数据库名字,db:数据库指针
//返回值:成功返回0, 失败返回-1
int open_sqlite(const string & database, sqlite3 **db)
{//打开数据库,这里注意库函数调用的是双重指针指向的值dbint rc = sqlite3_open(database.data(), db);if(1 == rc){cout << "您没有成功创建或打开数据库 " << database << endl;sqlite3_close(*db);return -1;}else{cout << "您已成功创建或打开数据库" << database << endl;return 0;}
}
//功能:创建sqlite列表
//参数:db数据库指针
//返回值:成功返回0, 失败返回-1
int create_table(sqlite3 *db)
{string sql;int rc;char * errMsg = nullptr;//创建数据库列表语句sql = "create table teacher(""name text not null,""age tinyint not null,""jobNumber int not null,""salary int primary key);";//执行创建数据库列表语句rc = sqlite3_exec(db, sql.data(), 0, 0, &errMsg);if(SQLITE_OK != rc){cout << "创建teacher表单失败: " << errMsg << endl;sqlite3_free(errMsg);}else{cout << "teacher 表单创建成功" << endl;}
//创建数据库列表语句sql = "create table student(""name text primary key,""age tinyint not null,""studentNumber int not null,""grade int not null);";//执行创建数据库列表语句rc = sqlite3_exec(db, sql.data(), 0, 0, &errMsg);if(SQLITE_OK != rc){cout << "创建student表单失败: " << errMsg << endl;sqlite3_free(errMsg);}else{cout << "student 表单创建成功" << endl;}return 0;
}
//功能:向数据库列表中插入数据
//参数:db数据库指针
//返回值:成功返回0, 失败返回-1
int insert_into(sqlite3 *db)
{string sql, table_name;int rc;char * errMsg = nullptr;sql = "insert into ";//输入表单名cout << "请输入您要输入的表单teacher/student"<< endl;cin >> table_name;if("teacher" != table_name && "student" != table_name){cout << "您要插入的表单我们这里目前还没有" << endl;return -1;}sql += table_name + " values";//输入数据值cout << "注意,下面如果输入的end按下回车,我们认为结束插入数据" << endl;cout << "分别输入如下所对应数据" << endl;if("teacher" == table_name){cout << "name age jobNumber salary" << endl;}else{cout << "name age studentNumber grade" << endl;}string name, age, number, data, temp;while(1){cin >> name;if("end" == name){//cout << "数据输入完毕" << endl;break;}cin >> age >> number >> data;temp = sql;sql += "(" + name + "," + age + "," + number + "," + data + ")" + ";";//cout << sql << endl;//执行数据库插入rc = sqlite3_exec(db, sql.data(), 0, 0, &errMsg);if(SQLITE_OK != rc){cout << "添加数据失败失败: " << errMsg << endl;sqlite3_free(errMsg);}sql = temp;}cout << "插入数据完成" << endl;return 0;
}
//功能:删除数据库列表中的数据
//参数:db数据库指针
//返回值:成功返回0, 失败返回-1
int delete_from(sqlite3 *db)
{string sql, del, table_name, name;int rc;char * errMsg = nullptr;//确定数据库列表cout << "请输入您想删除的数据的表单(teacher/student" << endl;cin >> table_name;if("teacher" != table_name && "student" != table_name){cout << "这里没有你想要的数据的表单" << endl;return -1;}//删除行的名字cout << "请输入你想删除数据的姓名" << endl;cin >> name;sql = "delete from " + table_name + " where name = " + name + ";";//cout << sql << endl;//执行删除数据库数据rc = sqlite3_exec(db, sql.data(), 0, 0, &errMsg);if(SQLITE_OK != rc){cout << "删除数据失败 " << errMsg << endl;sqlite3_free(errMsg);return -1;}else{cout << "删除成功" << endl;}return 0;
}
//功能:更新数据库列表里面的数据
//参数:db数据库指针
//返回值:成功返回0, 失败返回-1
int update_set(sqlite3 *db)
{string sql, table_name, name, age, number, data;int rc;char * errMsg = nullptr;//要更新的列表名cout << "请输入要更改数据的表单teacher/student" << endl;cin >> table_name;if("teacher" != table_name && "student" != table_name){cout << "没有相应的表单" << endl;return -1;}//重新输入要更新的所有数据cout << "输入要更改的数据的名字和要更改的所有数据" << endl;cin >> name >> age >> number >> data;//根据不同的列表更新数据if("teacher" == table_name){sql = "update " + table_name + " set age = " + age + ", jobNumber = " + number + ", salary = " + data + " where name = " + name + ";";}else{sql = "update " + table_name + " set age = " + age + ", studentNumber = " + number + ", grade = " + data + " where name = " + name + ";";}//cout << sql << endl;//更新数据rc = sqlite3_exec(db, sql.data(), 0, 0, &errMsg);if(SQLITE_OK != rc){cout << "更改失败: " << errMsg << endl;sqlite3_free(errMsg);return -1;}else{cout << "更改成功" << endl;}return 0;
}
//功能:查找列表中某行数据
//参数:db数据库指针
//返回值:成功返回0, 失败返回-1
int select_from(sqlite3 *db)
{string sql, table_name, name;int rc;char * errMsg = nullptr;//确定查询列表cout << "请输入要显示数据的表单teacher/student" << endl;cin >> table_name;if("teacher" != table_name && "student" != table_name){cout << "没有相应的表单" << endl;return -1;}//确定查询行名字cout << "请显示的名字" << endl;cin >> name;sql = "select * from " + table_name + " where name like " + name + ";";//cout << sql << endl;//执行查询,这里注意查询到的数据是通过回调函数callback打印输出的rc = sqlite3_exec(db, sql.data(), callback, NULL, &errMsg);if(SQLITE_OK != rc){cout << "显示失败: " << errMsg << endl;sqlite3_free(errMsg);return -1;}else{cout << "显示成功" << endl;}return 0;
}
//功能: 显示数据库列表中的所有数据
//参数:db数据库指针
//返回值:成功返回0, 失败返回-1
int show_table(sqlite3 *db)
{string sql, table_name;int rc;char * errMsg = nullptr;//确定要显示的列表cout << "请输入要显示数据的表单teacher/student" << endl;cin >> table_name;if("teacher" != table_name && "student" != table_name){cout << "没有相应的表单" << endl;return -1;}//sqlite语句sql = "select * from " + table_name + " ;";//cout << sql << endl;//进行数据库列表显示,这里需要注意显示输出是通过callback回调函数所实现的rc = sqlite3_exec(db, sql.data(), callback, NULL, &errMsg);if(SQLITE_OK != rc){cout << "显示失败: " << errMsg << endl;sqlite3_free(errMsg);return -1;}else{cout << "显示成功" << endl;}return 0;
}
//功能:推出数据库
//参数:db数据库指针
//返回值:成功返回0, 失败返回-1
int close_sqlite(sqlite3 *db)
{//关闭数据库int rc = sqlite3_close(db);if(0 == rc){cout << "数据库已经关闭" << endl;}else{cout << "数据库关闭失败" << endl;}return rc;
}
//功能: 回调显示函数
//参数:data:数据库指针,argc:该行的列数,
//argv:该行各列的字符串,colname:对应的列名的字符串数组
//返回值:成功返回0;
int callback(void *data, int argc, char **argv, char **azColName)
{int i;//循环对应列名字for(i = 0; i < argc; i++){cout << azColName[i] << "\t";}cout << endl;//循环打印行数据for(i = 0; i < argc; i++){cout << (argv[i] ? argv[i] : "NULL") << "\t";}cout << endl;return 0;
}
main.cpp
/*********************************************项目所有的文件名:main.cpp data.cpp data.h*作者:SELSL*版本:v1.0*描述:使用C++调用sqlite提供的API操作数据库实现数据库的增删改查等操作*其他:无*论坛:🕔*日志:初版 v1.0 2025/9/22 SELSL创建********************************************/
#include "data.h"
int main(int argc, const char * argv[])
{sqlite3 *db = nullptr;string database, table_name;//cout << "请您输入数据库名称" << endl;//cin >> database;database = "person.db";//打开数据库open_sqlite(database, &db);//创建数据库表单create_table(db);//用户选择操作提示cout << "输入1为插入数据" << endl;cout << "输入2为删除数据" << endl;cout << "输入3为更改数据" << endl;cout << "输入4为查找数据" << endl;cout << "输入5为显示所有数据" << endl;cout << "输入q为退出数据库编辑" << endl;//循环操作数据库while(1){char ch;//根据不同的输入,分别不同的操作switch(ch = getchar()){case '1'://增insert_into(db);break;case '2'://删delete_from(db);break;case '3'://改update_set(db);break;case '4'://查select_from(db);break;case '5'://显示show_table(db);break;}//退出if('q' == ch){break;}//提示用户操作数据else if('1' == ch || '2' == ch || '3' == ch || '4' == ch || '5' == ch){cout << "输入1为插入数据" << endl;cout << "输入2为删除数据" << endl;cout << "输入3为更改数据" << endl;cout << "输入4为查找数据" << endl;cout << "输入5为显示所有数据" << endl;cout << "输入q为退出数据库编辑" << endl;}}//关闭数据库close_sqlite(db);return 0;
}
4、编译代码
如果您使用本工程代码的Makefile的话可以直接输入以下命令编译
make
如果你不使用本项目的Makefile的话,可以输入下面指令进行编译
g++ main.cpp data.cpp -o main -lsqlite3 -Wall
在编译时您如果遇到如下问题
当出现这种问题时,安装 SQLite3 开发包即可解决
sudo apt update
sudo apt install libsqlite3-dev
再次make编译
这样就编译成功了,我们使用的是瑞莎科技推出的Cubie A7A,搭载全志的A773 SoC(双核Arm Cortex-A76 + 六核Arm Cortex-A55),它是一款功能丰富的单板计算机(SBC),系统是瑞莎官方提供的Debian系统,这款单板计算机性价比很高,很适合做一些Linux应用的开发和AI相关的开发。
5、运行测试
插入数据
删除数据
修改数据
查询数据
退出
使用命令行显示数据库里面的数据
这样看也是没有问题的。
总结:我们使用C++调用sqlite官方提供的API接口对数据库进行实战上的增删改查,在之后的数据本地存储也是提供了一种选择
资源参考:https://download.csdn.net/download/2403_82436914/91989842