小. 快速. 可靠.
选择任意三个.
SQLite C / C ++接口简介

1. Summary

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

2. Introduction

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

A separate document, The SQLite C/C++ Interface, provides detailed specifications for all C/C++ APIs for SQLite. Once the reader understands the basic principles of operation for SQLite, that document should be used as a reference guide. This article is intended as introduction only and is neither a complete nor authoritative reference for the SQLite API.

3. Core Objects And Interfaces

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

严格来说,不需要准备的语句对象,因为可以使用便捷包装器接口sqlite3_execsqlite3_get_table ,并且这些便捷包装器封装并隐藏准备好的语句对象. 但是,需要充分了解准备好的语句才能充分利用SQLite.

数据库连接准备好的语句对象由下面列出的一小组C / C ++接口例程控制.

Note that the list of routines above is conceptual rather than actual. Many of these routines come in multiple versions. For example, the list above shows a single routine named sqlite3_open() when in fact there are three separate routines that accomplish the same thing in slightly different ways: sqlite3_open(), sqlite3_open16() and sqlite3_open_v2(). The list mentions sqlite3_column() when in fact no such routine exists. The "sqlite3_column()" shown in the list is a placeholder for an entire family of routines that extra column data in various datatypes.

这是核心接口的摘要:

4. Typical Usage Of Core Routines And Objects

应用程序通常会在初始化期间使用sqlite3_open()创建单个数据库连接 . 请注意, sqlite3_open()可用于打开现有数据库文件或创建和打开新数据库文件. 尽管许多应用程序仅使用单个数据库连接 ,但是没有理由应用程序不能多次调用sqlite3_open()来打开多个数据库连接 -到同一数据库或不同数据库. 有时,多线程应用程序将为每个线程创建单独的数据库连接 . 请注意,单个数据库连接可以使用ATTACH SQL命令访问两个或多个数据库,因此不必为每个数据库文件建立单独的数据库连接.

许多应用程序在关闭时通过调用sqlite3_close()破坏其数据库连接 . 或者,例如,使用SQLite作为其应用程序文件格式的应用程序可能会响应"文件/打开"菜单操作而打开数据库连接 ,然后响应"文件/关闭"菜单而破坏相应的数据库连接 .

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

  1. 使用sqlite3_prepare()创建一个准备好的语句 .
  2. 通过调用sqlite3_step()一次或多次来评估准备好的语句 .
  3. 对于查询,通过调用提取结果sqlite3_column()两次调用之间sqlite3_step() .
  4. 使用sqlite3_finalize()销毁准备好的语句 .

前述是为了有效使用SQLite真正需要了解的所有内容. 剩下的就是优化和细节.

5. Convenience Wrappers Around Core Routines

sqlite3_exec()接口是一个便捷包装器,可通过一个函数调用执行上述所有四个步骤. 传递给sqlite3_exec()的回调函数用于处理结果集的每一行. sqlite3_get_table()是另一个方便包装程序,它执行上述所有四个步骤. 所述sqlite3_get_table()从接口不同sqlite3_exec() ,它存储在堆存储器的查询的结果,而不是调用的回调.

重要的是要意识到, sqlite3_exec()sqlite3_get_table()都无法执行使用核心例程无法完成的任何事情. 实际上,这些包装器完全是根据核心例程实现的.

6. Binding Parameters and Reusing Prepared Statements

在先前的讨论中,假设每个SQL语句仅准备一次,评估然后销毁. 但是,SQLite允许对同一条准备好的语句进行多次评估. 使用以下例程可以完成此操作:

在通过一次或多次调用sqlite3_step()评估准备好的语句后,可以重置该语句以便通过调用sqlite3_reset()再次对其进行评估. 将sqlite3_reset()视为将准备好的语句程序倒回开始. 在现有的准备好的语句上使用sqlite3_reset()而不是创建新的准备好的语句可以避免对sqlite3_prepare()的不必要调用. 对于许多SQL语句,运行sqlite3_prepare()所需的时间等于或超过sqlite3_step()所需的时间. 因此,避免调用sqlite3_prepare()可以显着提高性能.

多次评估完全相同的 SQL语句通常没有用. 通常,人们想评估类似的陈述. 例如,您可能想使用不同的值多次评估INSERT语句. 或者,您可能想使用WHERE子句中的不同键多次评估同一查询. 为了适应这种情况,SQLite允许SQL语句包含在被评估之前"绑定"到值的参数 . 以后可以更改这些值,并且可以使用新值再次评估相同的准备好的语句 .

SQLite允许在允许使用字符串文字,数字常量或NULL的任何地方使用参数 . (参数不能用于列名或表名.) 参数采用以下形式之一:

is an integer value and is an identifier. 在上面的示例中, 是整数, 是标识符. 参数最初的值为NULL. 在第一次调用sqlite3_step()之前或在sqlite3_reset()之后立即调用,该应用程序可以调用sqlite3_bind()接口将值附加到参数. 每次调用sqlite3_bind()都会覆盖先前对同一参数的绑定.

允许应用程序预先准备多个SQL语句并根据需要对其进行评估. 未完成的准备好的语句的数量没有任意限制. 一些应用程序在启动时会多次调用sqlite3_prepare()来创建他们将需要的所有准备好的语句 . 其他应用程序保留最近使用的准备 好的语句的缓存,然后在可用时将准备好的语句从缓存中重用. 另一种方法是仅在循环内的语句重新使用.

7. Configuring SQLite

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

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

处理范围内的配置完成并且之后数据库连接已经建立,从个人数据库连接可使用的呼叫进行配置sqlite3_limit()sqlite3_db_config() .

8. Extending SQLite

SQLite包含可用于扩展其功能的接口. 这些例程包括:

sqlite3_create_collat​​ion()接口用于创建用于整理文本的新整理序列 . sqlite3_create_module()接口用于注册新的虚拟表实现. sqlite3_vfs_register()接口创建新的VFSes .

sqlite3_create_function()接口创建新的SQL函数-标量或聚合. 新功能实现通常使用以下附加接口:

SQLite的所有内置SQL函数都是使用完全相同的接口创建的. 有关示例,请参考SQLite源代码,尤其是date.cfunc.c源文件.

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

9. Other Interfaces

本文仅提及最重要和最常用的SQLite接口. SQLite库包括许多其他API,这些API实现了此处未描述的有用功能. 在C / C ++接口规范中可以找到构成SQLite应用程序编程接口的功能完整列表 . 有关所有SQLite接口的完整和权威信息,请参阅该文档.

by  ICOPY.SITE