嵌入式下C/C++调用sqlite3简单开发

交叉编译sqlite3请关注我第一篇博文

sqlite3 交叉编译-CSDN博客

sqlite3的命令的简单使用(增删改查,创建/删除表)请关注我的上一篇博文

sqlite3嵌入式使用以及C/C++代码开发-CSDN博客

一、新建文件夹

此文件夹用于放置工程,比如我的文件夹叫sqliteDemo,将交叉编译编译好的sqlite3的lib文件夹和头文件放置在工程目录下

sqliteDemo文件夹下文件如下

二、创建测试文件

创建一个c文件,比如我的为main.c

在C文件中写入如下内容

#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"int main(void)
{sqlite3 *ppdb;int ret = sqlite3_open("student.db",&ppdb);if(ret != SQLITE_OK){printf("sqlite3_open Failed -- %s\n", sqlite3_errmsg(ppdb));exit(1);}return 0;
}

三、编译测试

执行命令  arm-linux-gnueabihf-gcc main.c -o sql -L./lib -lsqlite3

则生成一个命令 sql 的可执行文件

四、运行

将sql拷贝到开发板中的某个位置,执行 ./sql 即可运行

五、sqlite函数说明

sqlite3库函数在其官网有对应的说明,可登录其网站查阅

SQLite Home Page

其中,introduction列出了常用的几个函数,如果想看更多函数,可查看其函数列表网页List Of SQLite Functions

对于一般想小型开发,仅需掌握如下四个函数即可:

sqlite3_open()

sqlite3_close()

sqlite3_exec()

sqlite3_get_table()

下面对最常用几个函数进行介绍

sqlite3_open()

此函数功能为创建数据库,如果数据库已经创建,则打开数据库,函数原型如下Opening A New Database Connection

filename为数据库的名字,即执行 ./sqlite3 student命令时的student这个值

ppDb为数据库句柄,后续对数据库的所有操作都通过此句柄进行传值。

使用举例:

​
sqlite3 *ppDb;int ret = sqlite3_open("student.db", &ppDb);if(ret != SQLITE_OK)
{ printf("Open Sqlite3 Failed : %s\n",sqlite3_errmsg(ppDb));
}​
sqlite3_close() 此函数功能为关闭数据库,如果sqlite3对象被成功销毁并且所有相关资源都被释放,则对sqlite3_close()的调用返回SQLITE_OK。函数原型如下Closing A Database Connection使用举例
sqlite3 *ppDb;int ret = sqlite3_open("student.db", &ppDb);if(ret != SQLITE_OK)
{ printf("Open Sqlite3 Failed : %s\n",sqlite3_errmsg(ppDb));
}ret = sqlite3_close(ppDb);    //关闭数据库if(ret != SQLITE_OK)
{ printf("Release Sqlite3 Failed : %s\n",sqlite3_errmsg(ppDb));
}

sqlite3_exec()

此函数为sqlite3函数的重中之重,用它可以执行几乎所有的sqlite3命令。函数原型如下One-Step Query Execution Interface

第一个参数 sqlite3*,为一个打开的数据库的句柄,比如前面sqlite3_open函数中ppDb参数。

第二个参数为填有sql的命令行语句的字符串

第三个参数为回调函数。回调函数返回值为 int。但此参数只对有显示的命令行有效,比如:select * from student命令

第四个参数为回调函数需要传入的参数,即回调函数的第一个参数值

第五个保存错误消息

使用举例一

#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"int main(void)
{//打开或者创建数据库文件sqlite3 *ppdb;int ret = sqlite3_open("student.db",&ppdb);if(ret != SQLITE_OK){printf("Open Sqlite Failed -- %s\n",sqlite3_errmsg(ppdb));exit(1);}//创建数据表char *sqltCmd = "create table student (id integer, name txt, age integer);";ret = sqlite3_exec(ppdb, sqltCmd, NULL, NULL, NULL);if(ret != SQLITE_OK){printf("sqlite3_exec1 Failed! -- %s\n", sqlite3_errmsg(ppdb));exit (1);}//再次创建数据表char *errmsg;ret = sqlite3_exec(ppdb, sqltCmd, NULL, NULL, &errmsg);	//第五个参数保存错误消息if(ret != SQLITE_OK){//因为sqltCmd中的命令重复创建了数据表,所以会报错,命令行中的错误会通过errmsg指针返回//可以通过命令行输入两遍 sqltCmd 命令对比程序运行中的下一行打印printf("sqlite3_exec1 Failed! -- %s\n", sqlite3_errmsg(ppdb));exit (1);}ret = sqlite3_close(ppdb);if(ret != SQLITE_OK){printf("Sqlite Release Failed -- %s\n",sqlite3_errmsg(ppdb));exit(1);}return 0;
}

使用举例二

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlite3.h"/*
print函数每查询一行,就执行一次,故无需返回数据库的数据条数,也为行数
sql:需要传入的其它参数
colum:返回数据库的字段数,也为列数
value: 返回字段的值
name:返回字段的名称
*/
int print(void * sql, int column, char** value, char ** name)
{printf("第一个参数示例:%s\n",sql);int i;for(i = 0; i < column; i++){printf("%s=%s  ", name[i], value[i]);}printf("\n");return 0;
}int main(void)
{//创建或打开数据库sqlite3 *ppdb;int ret = sqlite3_open("student.db", &ppdb);if(ret != SQLITE_OK){printf("sqlite3_open : %s\n", sqlite3_errmsg(ppdb));exit(1);}//创建表 studentchar* sql = "create table if not exists student (id integer, name txt, age integer);";ret = sqlite3_exec(ppdb, sql, NULL, NULL, NULL);if(ret != SQLITE_OK){printf("sqlite3_exec1 : %s\n", sqlite3_errmsg(ppdb));exit(1);}char cmd[256] = {0};int id, age, i;char name[256]={0};for(i = 0; i < 2; i++){printf("请输入学号、名字和年龄:\n");scanf("%d%s%d",&id,name,&age);memset(cmd, 0, sizeof(cmd));sprintf(cmd,"insert into student (id, name, age) values(%d, '%s', %d);",id,name,age);ret = sqlite3_exec(ppdb, cmd, NULL, NULL, NULL);if(ret != SQLITE_OK){printf("sqlite3_exec2 : %s\n", sqlite3_errmsg(ppdb));exit(1);}}memset(cmd, 0, sizeof(cmd));sprintf(cmd,"select * from student;");ret = sqlite3_exec(ppdb, cmd, print, sql, NULL);//此处sql仅仅是用来说明传参问题if(ret != SQLITE_OK){printf("sqlite3_exec3 : %s\n", sqlite3_errmsg(ppdb));exit(1);}ret = sqlite3_close(ppdb);if(ret != SQLITE_OK){printf("sqlite3_close : %s\n", sqlite3_errmsg(ppdb));exit(1);}return 0;
}

执行效果如下

sqlite3_exec函数回调参数的再说明

以  使用举例二 为例,假如此时数据表中含有4项数据

在调用sqlite3_exec函数查询数据表时

每查询到一条数据,则调用一次 回调函数 print。

假如现在查询完第一条数据,即 1|aa|11 

则返回列数为 3(形参column 为 3),数据值为 1 aa 11 的字符串(即 *value 指向{"1", "aa", "11"}的字符串首地址),字段值为 id name age 的字符串(即*name 指向{"id","name","age"}的字符串的首地址)

因此,可以通过 value[i] 和 name[i] 找到对应的字符串

  • sqlite3_get_table

此函数为sqlite3专门用于查询语句的函数,函数原型如下

Convenience Routines For Running Queries

第一个参数为数据库的句柄

第二个参数为填有sql的命令行语句的字符串

第三个参数为查询后的返回值

第四个参数为查询到数据库中数据的条数(即行数)

第五个参数为查询到数据库中数据的字段数(即列数)

第三参数pazResult为一个一维数组,存放方式为    表头,表1对应的值,表2对应的值......

仍然以前面数据库为例说明

pazResult中数据存放方式如下图所述

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlite3.h"int main(void)
{//创建或打开数据库sqlite3* ppdb;int ret = sqlite3_open("student.db",&ppdb);if(ret != SQLITE_OK){printf("sqlite3_open : %s\n", sqlite3_errmsg(ppdb));exit(1);}char* sql = "create table student(id integer, name text, age integer);";ret = sqlite3_exec(ppdb, sql, NULL, NULL, NULL);if(ret != SQLITE_OK){printf("sqlite3_exec1 : %s\n", sqlite3_errmsg(ppdb));exit(1);}char cmd[256] = {0};int id, age, i, j;char name[128] = {0};for(i = 0; i < 2; i++){printf("请输入学号、名字和年龄:\n");scanf("%d%s%d",&id, name, &age);memset(cmd, 0, sizeof(cmd));sprintf(cmd, "insert into student(id, name, age) values (%d, '%s', %d);",id,name,age);ret = sqlite3_exec(ppdb, cmd, NULL, NULL, NULL);if(ret != SQLITE_OK){printf("sqlite3_exec2 : %s\n", sqlite3_errmsg(ppdb));exit(1);}}char **result;int row, column;memset(cmd, 0, sizeof(cmd));sprintf(cmd, "select * from student;");ret = sqlite3_get_table(ppdb, cmd, &result, &row, &column, NULL);if(ret != SQLITE_OK){printf("sqlite3_get_table: %s\n", sqlite3_errmsg(ppdb));exit(1);}int Index = column;for(i = 0; i < row; i++){for(j = 0; j < column; j++){//result[j]是指的表头的三个字符串//result[Index]是指的实际数据,实际数据是跨过表头后从column开始的数据//参照上面的内存截图理解printf("%s=%s  ",result[j], result[Index]);Index++;}printf("\n");}return 0;
}

实际执行效果如图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/773159.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt实现TFTP Server和 TFTP Client(三)

3.2 Client Client包括下面3个类&#xff1a; ClientSockeTFtpClientTFtpClientWidget 3.2.1 ClientSocke ClientSocke从BaseUdp派生实现write接口. 3.2.1.1 ClientSocke定义 #include "baseudp.h"class QUdpSocket; class ClientSocket : public BaseUdp { pu…

【C++】每日一题 45 跳跃游戏

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1] 的最…

SQLite中的原子提交(四)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite数据库成为内存中数据库&#xff08;三&#xff09; 下一篇&#xff1a;SQLite使用的临时文件&#xff08;二&#xff09; 1. 引言 SQLite等事务数据库的一个重要特性 是“原子提交”。 原子提交意味着所有数据库都在…

深度学习十大算法之图神经网络(GNN)

一、图神经网络的基础 图的基本概念 图是数学中的一个基本概念&#xff0c;用于表示事物间复杂的关系。在图论中&#xff0c;图通常被定义为一组节点&#xff08;或称为顶点&#xff09;以及连接这些节点的边。每个边可以有方向&#xff0c;称为有向边&#xff0c;或者没有方向…

网络原理讲解

目标 网络发展史 独立模式 独立模式&#xff1a;计算机之间相互独立&#xff1b; 网络互连 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&#xff0c;共享软件和数据&#xff0c;即以多个计算机协同工作来完成 业务&#xff0c;就有了网络互连。 网络互连&a…

学习笔记:MYSQL数据库基础知识

MYSQL数据库基础知识学习笔记 MYSQL基础学习数据库相关概念现主流数据库排名数据模型SQL分类SQL数据库基础操作 2024/3/27 学习资料&#xff1a;黑马程序员:MYSQL MYSQL基础学习 数据库和数据库管理系统(DBMS) 数据库: 是存储数据的集合&#xff0c;包括表、视图、索引等对象…

存内计算:释放潜能的黑科技

什么是存内计算&#xff1f; 存内计算技术是一种新型的计算架构&#xff0c;它将存储器和计算单元融合在一起&#xff0c;以实现高效的数据处理。存内计算技术的优势在于能够消除数据搬运的延迟和功耗&#xff0c;从而提高计算效率和能效比。目前&#xff0c;存内计算技术正处…

React Native获取及监听网络状态

在React Native中&#xff0c;要获取和监听网络状态&#xff0c;你可以使用react-native-netinfo库&#xff08;以前是核心库的一部分&#xff0c;但在React Native 0.60之后被移出并作为一个独立的库提供&#xff09;。以下是使用这个库来获取和监听网络状态的基本步骤&#x…

苹果Find My产品需求增长迅速,伦茨科技ST17H6x芯片供货充足

苹果的Find My功能使得用户可以轻松查找iPhone、Mac、AirPods以及Apple Watch等设备。如今Find My还进入了耳机、充电宝、箱包、电动车、保温杯等多个行业。苹果发布AirTag发布以来&#xff0c;大家都更加注重物品的防丢&#xff0c;苹果的 Find My 就可以查找 iPhone、Mac、Ai…

jupyter notebook导出含中文的pdf(LaTex安装和Pandoc、MiKTex安装)

用jupyter notebook导出pdf时&#xff0c;因为报错信息&#xff0c;需要用到Tex nbconvert failed: xelatex not found on PATH, if you have not installed xelatex you may need to do so. Find further instructions at https://nbconvert.readthedocs.io/en/latest/install…

pytorch中的torch.hub.load()

pytorch提供了torch.hub.load()函数加载模型&#xff0c;该方法可以从网上直接下载模型或是从本地加载模型。官方文档 torch.hub.load(repo_or_dir, model, *args, sourcegithub, trust_repoNone, force_reloadFalse, verboseTrue, skip_validationFalse, **kwargs)参数说明&a…

Focal Modulation Networks聚焦调制网络

摘要 我们提出了 焦点调制网络 &#xff08;简称 FocalNets) &#xff0c;其中 自注意&#xff08; SA &#xff09;被 Focal Modulation 替换&#xff0c;这种机制 包括三个组件&#xff1a;&#xff08; 1 &#xff09;通过 depth-wise Conv 提取分级的上下文信息&#xff0…

吴恩达深度学习笔记:浅层神经网络(Shallow neural networks)3.6-3.8

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第三周&#xff1a;浅层神经网络(Shallow neural networks)3.6 激活函数&#xff08;Activation functions&#xff09;3.7 为什么需要非线性激活函数&#xff1f;&#xff08;why need a non…

Spring Cloud 九:服务间通信与消息队列

Spring Cloud 一&#xff1a;Spring Cloud 简介 Spring Cloud 二&#xff1a;核心组件解析 Spring Cloud 三&#xff1a;API网关深入探索与实战应用 Spring Cloud 四&#xff1a;微服务治理与安全 Spring Cloud 五&#xff1a;Spring Cloud与持续集成/持续部署&#xff08;CI/C…

react native hooks 页面出现重绘问题,如何解决

在React Native应用中&#xff0c;使用Hooks导致页面出现频繁重绘或性能问题时&#xff0c;可以尝试以下策略来优化和解决问题&#xff1a; 减少不必要的状态更新&#xff1a; 使用 React.memo 高阶组件包裹那些不需要每次父组件状态改变时都重新渲染的子组件。它通过浅比较pro…

Java Web-Maven

Maven是apache旗下的一个开源项目&#xff0c;是一款用于管理和构建java项目的工具 Maven的作用 1.依赖管理:方便快捷的管理项目依赖资源(jar包)&#xff0c;避免版本冲突问题 我们有的项目需要大量的jar包&#xff0c;采用手动导包的方式非常繁琐&#xff0c;并且版本升级也…

面试官:2PC和3PC有什么区别?

本文内容已收录至我的面试网站&#xff1a;www.javacn.site 在分布式事务中&#xff0c;通常使用两阶段协议或三阶段协议来保障分布式事务的正常运行&#xff0c;它也是 X/Open 公司定义的一套分布式事务标准。 X/Open 公司是由多家国际计算机厂商所组成的联盟组织&#xff0c;…

【前端】-【性能优化常识】

目录 前端性能优化指标首屏速度、白屏时间性能优化收效很大的操作&#xff1a;减少首屏资源体积收效不大或者特殊情况的优化操作 操作速度、渲染速度造成操作卡顿和渲染慢的场景性能优化 数据缓存 补充知识异步加载加载方式一&#xff1a;prefetch加载加载方式二&#xff1a;sc…

小迪安全48WEB 攻防-通用漏洞Py 反序列化链构造自动审计 bandit魔术方法

#知识点&#xff1a; 1、Python-反序列化函数使用 2、Python-反序列化魔术方法 3、Python-反序列化 POP 链构造&#xff08;payload构造&#xff09; 4、Python-自动化审计 bandit 使用 #前置知识&#xff1a; 函数使用&#xff1a; pickle.dump(obj, file) : 将对…

如何利用nginx在Centos上搭建文件服务器

第一步&#xff1a;创建export文件夹 其下soft文件夹和server文件夹 soft放软件压缩包&#xff0c;server放解压安装后的软件 第二步&#xff1a;yum -y install make gcc-c zlib zlib-devel libtool openssl openssl-devel libpcre3 libpcre3-dev 下载gcc 依赖环境安装 …