1.总结
以下两个对象和八个方法构成了SQLite接口的基本元素:
-
sqlite3 →数据库连接对象。通过sqlite3_open()创建 ,并通过sqlite3_close()销毁 。
-
sqlite3_stmt →准备好的语句对象。通过sqlite3_prepare() 创建 ,并通过sqlite3_finalize()销毁 。
-
sqlite3_open() →对新的或现有的SQLite数据库建立连接。sqlite3的构造函数。
-
sqlite3_prepare() →将SQL文本编译为字节代码,它将完成查询或更新数据库的工作。sqlite3_stmt的构造函数。
-
sqlite3_bind() →将应用程序数据存储到 原始SQL的参数中。
-
sqlite3_step() →将 sqlite3_stmt前进到下一个结果行或完成。
-
sqlite3_column()当前结果行用于在→列值 sqlite3_stmt。
-
sqlite3_exec() →一个包装函数,对一个或多个SQL语句字符串执行 sqlite3_prepare(), sqlite3_step(), sqlite3_column()和 sqlite3_finalize()。
2.核心对象和接口
SQL数据库引擎的主要任务是评估SQL的SQL语句。为此,开发人员需要两个对象:
严格来说,不需要准备的语句对象,因为可以使用便捷包装器接口sqlite3_exec或 sqlite3_get_table,并且这些便捷包装器封装并隐藏准备好的语句对象。但是,需要充分了解 准备好的语句才能充分利用SQLite。
的数据库连接和准备的语句的目的是通过一小的C / C ++接口例程的下列控制。
请注意,上面的例程列表是概念性的,而不是实际的。其中许多例程有多个版本。例如,上面的列表显示了一个名为sqlite3_open()的例程,而实际上有三个单独的例程以略有不同的方式完成同一件事: sqlite3_open(),sqlite3_open16()和sqlite3_open_v2()。该列表提到了sqlite3_column() ,而实际上不存在这样的例程。列表中显示的“ sqlite3_column()”是整个例程系列的占位符,这些例程会在各种数据类型中增加列数据。
这是核心接口的摘要:
-
该例程打开与SQLite数据库文件的连接,并返回 数据库连接对象。这通常是应用程序进行的第一个SQLite API调用,并且是大多数其他SQLite API的前提条件。许多SQLite接口要求将指向数据库连接对象的指针作为其第一个参数,并且可以将其视为数据库连接对象上的方法。该例程是数据库连接对象的构造函数。
-
该例程将SQL文本转换为准备好的语句对象,并返回指向该对象的指针。此接口需要一个由先前调用sqlite3_open()创建的数据库连接指针和一个包含要准备的SQL语句的文本字符串。该API实际上不会评估SQL语句。它只是准备要评估的SQL语句。
将每个SQL语句视为一个小型计算机程序。sqlite3_prepare()的目的是将该程序编译为目标代码。在准备语句是目标代码。然后,sqlite3_step()接口运行目标代码以获取结果。
新应用程序应始终调用sqlite3_prepare_v2()而不是sqlite3_prepare()。保留较旧的sqlite3_prepare()是为了向后兼容。但是sqlite3_prepare_v2()提供了一个更好的接口。
-
此例程用于评估先前由sqlite3_prepare()接口创建的预准备语句。对该语句进行评估,直到结果的第一行可用为止。要前进到结果的第二行,请再次调用sqlite3_step()。继续调用sqlite3_step()直到语句完成。不返回结果的语句(例如INSERT,UPDATE或DELETE语句)在单次调用sqlite3_step()时便运行完毕。
-
该例程从结果集的当前行返回一个单列,用于由sqlite3_step()评估的准备好的语句。每次sqlite3_step()以新的结果集行停止时,可以多次调用此例程以查找该行中所有列的值。
如上所述,在SQLite API中确实没有“ sqlite3_column()”函数之类的东西。相反,我们在这里所谓的“ sqlite3_column()”是整个函数系列的占位符,这些函数从各种数据类型的结果集中返回一个值。该族中还有一些例程可以返回结果的大小(如果它是字符串或BLOB)和结果集中的列数。
-
此例程破坏了由对sqlite3_prepare()的先前调用创建的准备好的语句。必须使用对此例程的调用来销毁每个准备好的语句,以避免内存泄漏。
-
该例程关闭先前通过调用sqlite3_open()打开的数据库连接。与连接关联的所有准备好的语句应在关闭连接之前完成。
3.核心例程和对象的典型用法
应用程序通常会 在初始化期间使用 sqlite3_open()创建单个数据库连接。请注意,sqlite3_open()可用于打开现有数据库文件或创建和打开新数据库文件。尽管许多应用程序仅使用一个数据库连接,但是没有理由应用程序不能多次调用sqlite3_open()来打开多个数据库连接 -到同一数据库或不同数据库。有时,多线程应用程序将为每个线程创建单独的数据库连接。请注意,单个数据库连接可以使用ATTACH SQL命令访问两个或多个数据库,因此不必为每个数据库文件建立单独的数据库连接。
许多应用程序在关闭时通过调用 sqlite3_close()关闭其数据库连接。或者,例如,使用SQLite作为其应用程序文件格式的应用程序可能会响应于File / Open菜单操作而打开数据库连接,然后响应于File / Close菜单而破坏相应的数据库连接。
要运行SQL语句,应用程序将遵循以下步骤:
- 使用sqlite3_prepare()创建一个准备好的语句。
- 通过调用sqlite3_step()一次或多次来评估准备好的语句。
- 对于查询,通过调用提取结果 sqlite3_column()两次调用之间sqlite3_step() 。
- 使用sqlite3_finalize()销毁准备好的语句。
前述是为了有效使用SQLite真正需要了解的所有内容。剩下的就是优化和细节。
4.核心例程周围的便利包装
sqlite3_exec()接口是一个方便的包装,其执行与一个函数调用上述步骤全部四个。传递给sqlite3_exec()的回调函数用于处理结果集的每一行。所述sqlite3_get_table()是另一种方便的包装,做上述步骤全部四个。所述sqlite3_get_table()从接口不同sqlite3_exec(),它存储在堆存储器的查询的结果,而不是调用的回调。
重要的是要意识到,sqlite3_exec()和 sqlite3_get_table()都无法执行使用核心例程无法完成的任何事情。实际上,这些包装器完全是根据核心例程实现的。
5.绑定参数和重用准备好的语句
在先前的讨论中,假定每个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的任何地方使用参数。(参数不能用于列名或表名。)参数采用以下形式之一:
- ?
- ?神经网络
- :AAA
- $ AAA
- @ AAA
在上面的示例中,NNN是整数, AAA是标识符。参数最初的值为NULL。在第一次调用sqlite3_step()之前或在sqlite3_reset()之后立即调用该应用程序,应用程序可以调用 sqlite3_bind()接口将值附加到参数。每次调用sqlite3_bind()都会 覆盖同一参数上的先前绑定。
允许应用程序预先准备多个SQL语句并根据需要对其进行评估。未完成的准备好的语句的数量没有任意限制 。一些应用程序在启动时会多次调用sqlite3_prepare()来创建他们将需要的所有准备好的语句。其他应用程序保留最近使用的准备好的语句的缓存 ,然后在可用时将准备好的语句从缓存中重用。另一种方法是仅在循环中使用已准备好的语句时再使用它们。
6.配置SQLite
SQLite的默认配置适用于大多数应用程序。但是有时候开发人员想要调整设置,以尝试提高性能,或者利用一些晦涩的功能。
所述sqlite3_config()接口是用来制造用于SQLite的全球性的,过程范围的配置变化。在创建任何数据库连接之前,必须调用sqlite3_config()接口。该 sqlite3_config()接口允许程序员在做这样的事情:
- 调整SQLite进行内存分配的方式,包括设置适用于安全关键的实时嵌入式系统和应用程序定义的内存分配器的备用内存分配器。
- 设置整个过程的错误日志。
- 指定应用程序定义的页面缓存。
- 调整互斥锁的使用,使其适合于各种 线程模型,或替换应用程序定义的互斥锁系统。
处理范围内的配置完成并且之后数据库连接 已经建立,从个人数据库连接可使用的呼叫进行配置sqlite3_limit()和sqlite3_db_config() 。
7.扩展SQLite
SQLite包含可用于扩展其功能的接口。这些例程包括:
所述sqlite3_create_collation()接口被用来创建新的 整理序列进行排序文本。所述sqlite3_create_module()接口用于登记新的 虚拟表的实现。该sqlite3_vfs_register()接口创建新VFSes。
该sqlite3_create_function()接口创建新的SQL功能-无论是标量或集合。新功能实现通常使用以下附加接口:
SQLite的所有内置SQL函数都是使用完全相同的接口创建的。