SQLiteC/C++接口简介

快速跳转文章列表:SQLite—系列文章目录 

上一篇:SQLite——世界上部署最广泛的开源数据库(简介) 

下一篇:SQLiteC/C++接口详细介绍(一)

引言:

作为一种轻量级、嵌入式关系型数据库,SQLite已经成为许多应用和系统的首选解决方案。它是一个开源软件库,以小型、快速和易于使用而著称。为了方便C/C++程序员使用SQLite,SQLite提供了官方的C/C++接口。这个接口允许开发人员在他们的程序中使用标准的C/C++函数来操作SQLite数据库,包括查询和更新数据,管理数据库连接和事务等。

SQLite拥有超过225个API。但是,大多数API都是可选的,并且非常专业并且可以被初学者忽略。核心API体积小、简单且易于学习。本文总结了核心API。

后续文章陆续阐述更为详细SQLiteC/C++接口,提供详细介绍的适用于SQLite的所有C/C++API的规范。本文供了解SQLite的基本操作原理,该文档应作为参考指导。本文仅供介绍之用,不是SQLiteAPI的完整或权威参考。1

编写不易,有用的朋友点个赞或加粉一下万分感谢!300名内回关!

一.核心接口简介

以下两个对象和八个方法构成了基本要素SQLite接口的元素:

  1. sqlite3_open():用于打开或创建一个SQLite数据库文件,并返回一个可用于访问该数据库的数据库连接对象。如果指定的数据库文件不存在,则函数将自动创建新的数据库文件。
  2. sqlite3_prepare():用于编译和解析SQL语句并创建一个新的预处理语句对象。在编译SQL语句时,会将语句进行语法和语义分析,检查其中的误差,并将其转换为一个内部表示以供SQLite引擎进行操作。
  3. sqlite3_stmt:表示SQLite预处理语句。预处理语句在编译SQL语句时用于管理和执行SQL语句中的参数、SQL语句的编译结果以及查询结果的迭代。
  4. 在SQLite中,预处理语句使用和相关函数编译创建,其中返回一个指向结构体的指针。预处理语句可以存储为通常的命名变量或使用函数内部的栈分配。一旦创建,预处理语句就可以在使用执行它之前,通过系列函数向其中绑定数据。执行预处理语句的迭代时,将获取查询结果的行并使用类似
  5. sqlite3_bind():用于将输入参数绑定到SQLite预处理语句中。预处理语句在编译SQL语句时,其中包含位置参数'?'的语句,通过对预处理语句使用sqlite3bind()函数将参数值设置到预处理语句上,然后使用sqlite3_step()执行预处理语句。sqlite3_step():用于迭代在SQLite数据库中执行的SELECT语句的结果行、插入数据、更新数据或删除数据。它通过将查询结果的行迭代器向下移动一行来获取结果集中的下一行数据,并返回SQLITEROW指示更多行可用。如果结果集中没有更多行,则迭代器将停留在最后一行,并返回SQLITE_DONE。
  6. sqlite3_column():SQLiteC/C++接口中的一个函数,它用于获取SELECT查询语句中返回的结果集中指定列的值。该函数通过提供列索引或列名来定位指定的列,并根据该列的数据类型返回值。sqlite3_finalize()→sqlite3_stmt的析构函数。
  7. sqlite3_close():关闭打开的SQLite数据库连接。在使用完SQLite数据库之后,调用sqlite3close()函数会释放相关资源,包括数据库连接、预处理语句和命令对象等,从而避免内存泄漏和资源浪费。
  8. sqlite3_exec():在数据库中执行一条或多条SQL语句(例如,查询、插入、更新和删除等)。并且它将一条或多条SQL语句作为一个字符串作为参数进行调用,这使得执行SQL语句非常方便。

二.核心对象和接口

SQL数据库引擎的主要任务是评估SQL语句的SQL。为此,开发人员需要两个对象:

数据库连接对象:sqlite3

预准备语句对象:sqlite3_stmt

严格来说,预准备语句对象不是必需的,因为可以使用便利包装器接口,sqlite3_exec或sqlite3_get_table,这些便利包装器封装和隐藏预准备语句对象。然而,要充分利用SQLite,需要了解准备好的语句。

控制数据库连接和预准备语句对象由下面列出的一小组C/C++接口函数。

sqlite3_open()

sqlite3_prepare()

sqlite3_step()

sqlite3_column()

sqlite3_finalize()

sqlite3_close()

注意,上面的函数列表是概念性的,而不是实际的。其中许多函数都有多个版本。例如,上面的列表显示了一个函数命名为sqlite3_open(),而实际上有三个单独的函数以略有不同的方式完成相同的事情:sqlite3_open()、sqlite3_open16()和sqlite3_open_v2()。该列表提到了sqlite3_column(),而实际上并不存在这样的函数。列表中显示的“sqlite3_column()”是提取列的整个函数系列各种数据类型的数据。

以下是核心接口的功能摘要:

sqlite3_open()

这个函数打开与SQLite数据库文件的连接并返回数据库连接对象。这通常是第一个SQLiteAPI应用程序进行的调用是大多数其他应用程序的先决条件SQLiteAPI。许多SQLite接口需要指向数据库连接对象作为其第一个参数,并且可以被视为数据库连接对象上的方法。此函数是数据库连接对象的构造函数。

sqlite3_prepare()

这个函数将SQL文本转换为预准备语句对象并返回指针到该对象。此接口需要数据库连接指针由对sqlite3_open()的先前调用和包含要准备的SQL语句。此API实际上不会评估SQL语句。它只是准备用于评估的SQL语句。将每个SQL语句视为一个小型计算机程序。目的ofsqlite3_prepare()是将该程序编译为目标代码。预准备语句是目标代码。sqlite3_step()接口然后运行目标代码以获取结果。新应用程序应始终调用sqlite3_prepare_v2()的sqlite3_prepare()。较旧的sqlite3_prepare()保留用于向后兼容性。但是sqlite3_prepare_v2()提供了很多更好的界面。

sqlite3_step()

此函数用于评估已准备好的语句以前由sqlite3_prepare()接口创建。声明被评估到第一行结果可用。若要前进到结果的第二行,请再次调用sqlite3_step()。继续调用sqlite3_step(),直到语句完成。不返回结果的语句(例如:INSERT、UPDATE或DELETE语句)在对sqlite3_step()的单次调用中运行到完成。

sqlite3_column()

用于检索SQLite查询语句的结果集中的列数据。这些函数采用不同的数据类型并提供不同的功能,因此可以根据需要具体选择某个函数。在SQLite查询结果集中的每列数据类型都可以是NULL、整数、浮点数、字符串、二进制数据或其他类型,因此需要根据实际情况使用不同的`sqlite3_column_*()`函数。以下是常用的`sqlite3_column_*()`函数列表:sqlite3_column_blob()返回BLOB类型

  1. sqlite3_column_bytes()返回单字节无符号数
  2. sqlite3_column_bytes16()返回双字节无符号数
  3. sqlite3_column_count()返回查询到记录的数量
  4. sqlite3_column_double()返回双精度值
  5. sqlite3_column_int()返回32位整数结果
  6. sqlite3_column_int64()返回64位整数结果
  7. sqlite3_column_text()返回UTF-8文本结果
  8. sqlite3_column_text16()返回UTF-16文本结果
  9. sqlite3_column_type()返回结果的数据类型
  10. sqlite3_column_value()返回结果为未受保护的sqlite3_value对象

sqlite3_finalize()函数:

与sqlite3_prepare()函数配对使用,如果使用了sqlite3_prepare()函数则必须使用调用此函数以避免内存泄漏。

sqlite3_close()

此函数关闭以前由调用打开的数据库连接更改为sqlite3_open()。与连接应在关闭之前完成连接。

三核心函数和对象的典型用法

应用程序通常会在初始化期间使用sqlite3_open()创建单个数据库连接。请注意,sqlite3_open()可用于打开现有数据库文件或创建并打开新的数据库文件。虽然许多应用程序仅使用单个数据库连接,但有应用程序没有理由不能多次调用sqlite3_open()为了打开多个数据库连接-要么到相同的数据库或不同的数据库。有时是多线程应用程序将为每个线程创建单独的数据库连接。请注意,单个数据库连接可以访问两个或多个数据库,因此没有必要为每个数据库文件建立单独的数据库连接。

许多应用程序在关机时使用对sqlite3_close()的调用来破坏其数据库连接。或者,例如,应用程序使用SQLite作为其应用程序文件格式打开数据库连接以响应“文件”/“打开”菜单操作然后销毁相应的数据库连接作为响应到“文件/关闭”菜单。

若要运行SQL语句,应用程序将执行以下步骤:

使用sqlite3_prepare()创建预准备语句。

通过调用sqlite3_step()one来评估预准备语句或更多次。

对于查询,通过调用sqlite3_column()来提取结果对sqlite3_step()的两次调用。

调用sqlite3_finalize()来sqlite3_prepare()创建的语句。以上是使用SQLite真正需要了解的全部内容有效。剩下的就是优化和细节了。

四.围绕核心函数的便利包装

sqlite3_exec() 接口是一个方便的包装器,可以通过一次函数调用执行以上所有四个步骤。传递给 sqlite3_exec() 的回调函数用于处理结果集中的每一行数据。sqlite3_get_table() 是另一个方便的包装器,也执行以上所有四个步骤。与 sqlite3_exec() 不同的是,sqlite3_get_table() 将查询的结果存储在堆内存中,而非通过回调函数调用处理数据。

需要注意的是,sqlite3_exec() 和 sqlite3_get_table() 都不做任何无法通过核心函数实现的工作。事实上,这些包装器纯粹是通过核心函数实现的。五.绑定参数和重用预准备语句

在之前的讨论中,我们默认每个 SQL 语句只被准备一次,执行完后便会被销毁。然而,SQLite 允许同一个准备好的语句被多次执行。这可以使用以下函数实现:

sqlite3_reset()

sqlite3_bind()

在通过对sqlite3_step()的一个或多个调用计算准备好的语句后,可以重置它,以便由调用sqlite3_reset()。将sqlite3_reset()视为倒带准备好的语句程序回到开头。在现有预准备语句上使用sqlite3_reset()而不是创建新的预准备语句可避免对sqlite3_prepare()的不必要调用。对于许多SQL语句,所需的时间运行sqlite3_prepare()等于或超过sqlite3_step()所需的时间。因此,避免调用sqlite3_prepare()可以给显著的性能改进。

评估完全相同的SQL通常没有用处语句不止一次。更常见的是,人们想要评估类似的语句。例如,您可能希望计算INSERT语句多次使用不同的值。或者,您可能想要评估在WHERE子句中使用不同的键多次执行同一查询。为了适应因此,SQLite允许SQL语句包含在计算之前与值“绑定”的参数。这些值可以稍后更改,可以计算相同的预准备语句第二次使用新值。

SQLite允许参数在字符串文本、允许使用blob文本、数值常量或NULL在查询或数据修改语句中。(DQL或DML)(参数不得用于列名或表名,或作为约束或默认值的值。(DDL))参数采用以下形式之一:

?

?NNN的

:AAA级

$AAA级

@AAA级

在上面的示例中,NNN是一个整数值,AAA是一个标识符。参数的初始值为NULL。在首次调用sqlite3_step()之前或立即调用在sqlite3_reset()之后,应用程序可以调用sqlite3_bind()接口来附加值到参数。每次调用sqlite3_bind()都会覆盖同一参数上的先前绑定。

允许应用程序提前准备多个SQL语句并根据需要对其进行评估。未完成的已编制报表的数目没有任意限制。某些应用程序在启动时多次调用sqlite3_prepare()来创建他们需要的所有准备好的语句。其他应用程序保留最近使用的预准备语句的缓存,然后在可用时从缓存中重用预准备语句。另一种方法是仅在以下情况下重用准备好的语句在循环中。

六.配置SQLite

SQLite的默认配置适用于大多数应用程序。但有时开发人员想要调整设置以尝试挤出性能提高一点,或者利用一些晦涩难懂的功能。

sqlite3_config()接口用于使全局的、进程范围的SQLite的配置更改。sqlite3_config()接口必须在创建任何数据库连接之前调用。sqlite3_config()接口允许程序员执行以下操作:

调整SQLite进行内存分配的方式,包括设置适用于安全关键型的备用内存分配器实时嵌入式系统和应用定义的内存分配器。

设置进程范围的错误日志。

指定应用程序定义的页面缓存。

调整互斥锁的使用,使其适用于各种线程模型,或将应用程序定义的互斥锁系统。

在完成进程范围的配置并创建数据库连接后,可以使用以下命令配置单个数据库连接调用sqlite3_limit()和sqlite3_db_config()。

七.除了以上核心接口我们还可以使用扩展SQLite接口

SQLite包含可用于扩展其功能的接口。此类函数包括:

sqlite3_vfs_register()向SQLite引擎注册自定义VFS(VirtualFileSystem,虚拟文件系统)。通过注册自定义VFS,开发人员可以在SQLite数据库中使用自己的文件访问方法,从而实现自定义的文件读写操作

sqlite3_create_collation()创建自定义排序规则(collation),以扩展SQLite数据库的功能。该函数允许开发人员通过提供自己的代码,向SQLite引擎添加自定义排序规则,用于控制SQLite数据库中字符串的排序。

sqlite3_create_module()创建自定义的SQLite扩展模块,以扩展SQLite数据库的功能。该函数允许开发人员通过提供自己的代码,向SQLite引擎添加自定义的数据库引擎、函数、虚拟表或其他扩展模块。

sqlite3_create_function()创建自定义的SQL函数,以扩展SQLite数据库的功能。该函数允许开发人员通过提供自己的代码,向SQLite引擎添加自定义函数,用于执行数据处理、转换和计算操作等。

新函数实现通常使用以下附加接口:

sqlite3_aggregate_context()用于获取或设置用于聚合函数的上下文。在使用自定义聚合函数时,开发人员可以使用

sqlite3_result()在聚合函数中设置“最终结果”。在使用自定义聚合函数时,开发人员可以使用  函数设置聚合函数的最终结果,该结果将作为查询的返回值。

sqlite3_user_data()获取与自定义聚合函数关联的数据指针。在使用自定义聚合函数时,开发人员可以使用  函数获取与聚合函数关联的特定数据,如函数参数、全局配置等。

sqlite3_value()获取 SQL 语句中查询结果中的特定值。在编写自定义聚合函数时,开发人员可以使用  函数获取 SQL 语句中查询结果中的某个值,并在自定义聚合函数中使用它。

SQLite的所有内置SQL函数都是使用这些相同的接口。请参阅SQLite源代码,特别是date.c和func.c源文件例如。

共享库或DLL可用作SQLite的可加载扩展。

八.其他接口

本文只提到最重要和最常见的使用了SQLite接口。SQLite库包括许多其他实现有用的API此处未描述的功能。构成SQLite的函数的完整列表应用程序编程接口可在C/C++接口规范中找到。有关以下内容的完整和权威信息,请参阅该文档所有SQLite接口。参考文献:

1.AnIntroductionToTheSQLiteC/C++Interface

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

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

相关文章

MAC M芯片 Anaconda安装

Anaconda安装 1.M芯片下载AnaConda 1.M芯片下载AnaConda https://www.anaconda.com/download 安装完成 conda的版本是24.1.2

Go语言中的make和new:内存分配与对象创建的巧妙之道

Go语言中的make和new:内存分配与对象创建的巧妙之道 Go语言作为一门简洁而强大的编程语言,提供了多种用于动态内存分配和对象创建的关键词。其中,make和new是两个常见且常被混淆的关键词。本文将深入讲解Go语言中make和new的区别,…

python来判断密码强弱-类

设计者:ISDF 版本:v1.0 日期:2019/4/3设计者:ISDF 版本:v2.0 日期:2024/4/3 class PasswordTool:密码工具类def __init__(self,password):#类的属性self.password passwordself.stregth_level 0def check…

考研C语言复习进阶(5)

目录 1. 为什么使用文件 2. 什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3. 文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 4. 文件的顺序读写 ​编辑 ​编辑 4.1 对比一组函数: ​编辑 5. 文件的随机读写 5.1 fseek 5.2 ftell 5.3 rewind…

【C语言】linux内核pci_save_state

一、中文注释 //include\linux\pci.h /* 电源管理相关的例程 */ int pci_save_state(struct pci_dev *dev);//drivers\pci\pci.c /*** pci_save_state - 在挂起前保存PCI设备的配置空间* dev: - 我们正在处理的PCI设备*/ int pci_save_state(struct pci_dev *dev) {int i;/* X…

谷歌网络营销方案有几种?​

谷歌作为海外的头部工具,本身其实就有多种工具可以供你使用,在这里说说谷歌那些工具 Google My Business,对于小企业或者本地服务来说,把自己的业务信息优化并完善在Google My Business上是个不错的选择。这样当人们在附近搜索相…

微信小程序云开发教程——墨刀原型工具入门(表单组件)

引言 作为一个小白,小北要怎么在短时间内快速学会微信小程序原型设计? “时间紧,任务重”,这意味着学习时必须把握微信小程序原型设计中的重点、难点,而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

【NC223888】红色和紫色

题目 红色和紫色 博弈论,想得出来思路就简单,想不出来就难。一般使用猜测法。 思路 如果小红随意取一个格子涂色,那么小紫怎么涂色才是她的最优选择呢? 假设小紫只能选择小红涂色的格子的相邻格子或者是最近斜对角的一个格子涂色…

LeetCode 2684.矩阵中移动的最大次数:一列一列处理,只记能到哪行(BFS)

【LetMeFly】2684.矩阵中移动的最大次数:一列一列处理,只记能到哪行(BFS) 力扣题目链接:https://leetcode.cn/problems/maximum-number-of-moves-in-a-grid/ 给你一个下标从 0 开始、大小为 m x n 的矩阵 grid ,矩阵由若干 正 整…

【漏洞复现】大华智慧园区综合管理平台SQL注入漏洞

Nx01 产品简介 大华智慧园区综合管理平台是一款综合管理平台,具备园区运营、资源调配和智能服务等功能。该平台旨在协助优化园区资源分配,满足多元化的管理需求,同时通过提供智能服务,增强使用体验。 Nx02 漏洞描述 大华智慧园区…

Halcon图像预处理、阈值分割

1、blob(Binary Large Object)是指二值图像中连通区域。 预处理通常包括一系列步骤,例如去噪、形态学操作、特征提取等。 read_image(Image,claudia) get_image_size(Image,Width,Height) dev_open_window_fit_size (0, 0, Width, Width, -1,…

如何在iPhone上恢复已删除的微信聊天记录?

你好,我前几天删除了微信聊天记录。有什么办法可以恢复iPhone上已删除的微信聊天记录吗? 有些人每次使用设备时都会遇到在 iPhone 上丢失消息的风险。特别是,由于多种因素,可能会丢失第三方数据,微信消息也是如此。微…

2024Vue高频面试题

前言: Vue 在前端开发领域拥有强劲的发展势头,以下是一些 Vue 的发展趋势: 1.持续增长的用户数量: Vue 作为一款轻量级、易学易用的前端框架,吸引了越来越多的开发者和企业选择使用。其活跃的社区和丰富的资源也促进了用户数量的不断增长。 2.生态系统不断丰富: 随着 V…

远超预期,特效吹爆!《武庚纪》:建议漫改都按这个标准来!

作为《武庚纪》动画党,听闻要改编成真人电视剧时,最害怕的无非五毛钱特效,流水线仙侠,无脑古偶。但在看过《烈焰》(原名:武庚纪)之后,不得不感叹一句:“倒也不用这么还原…

【计算机网络篇】计算机网络的性能指标

文章目录 🍔计算机网络的性能指标🗃️常见的计算机网络性能指标⭐速率⭐带宽⭐吞吐量⭐时延⭐时延带宽积⭐往返时间⭐利用率⭐丢包率 🔎总结 🍔计算机网络的性能指标 计算机网络的性能指标被用来从不同方面度量计算机网络的性能 …

算法的渐进时间复杂度

T(n) = O(F(n)) T(n):Time 渐进时间复杂度 O:正比例关系 F(n):代码执行次数 只要代码执行的次数越来越多 所耗费的时间也就越来越高 常见的5种: O(n^2) O(n logn) O(n) O(logn) O(1):不管重复多少次1次也是这个时间,10次也是这个时间。 时间复杂度排序:由小到…

JAVA22 FFM实战之HelloWorld

前言 JDK22即将发布,Java Foreign Function & Memory API将会退出预览,是时候开始学习一波了。 FFM API介绍 FFM API由两大部分组成,一个是Foreign Function Interface,另一个是Memory API。前者是外部函数接口&#xff0c…

对模型性能进行评估(Machine Learning 研习十五)

在上一篇我们已然训练了一个用于对数字图像识别的模型,但我们目前还不知道该模型在识别数字图像效率如何?所以,本文将对该模型进行评估。 使用交叉验证衡量准确性 评估模型的一个好方法是使用交叉验证,让我们使用cross_val_score…

机器学习-04-分类算法-02贝叶斯算法

总结 本系列是机器学习课程的系列课程,主要介绍机器学习中分类算法,本篇为分类算法与贝叶斯算法部分。 本门课程的目标 完成一个特定行业的算法应用全过程: 懂业务会选择合适的算法数据处理算法训练算法调优算法融合 算法评估持续调优工程…

MySQL大小写敏感、MySQL设置字段大小写敏感

文章目录 一、MySQL大小写敏感规则二、设置数据库及表名大小写敏感2.1、查询库名及表名是否大小写敏感2.2、修改库名及表名大小写敏感 三、MySQL列名大小写不敏感四、lower_case_table_name与校对规则4.1、验证校对规则影响大小写敏感4.1、验证校对规则影响排序 五、设置字段内…