SQLite CC++接口介绍(二)

前端之家收集整理的这篇文章主要介绍了SQLite CC++接口介绍(二)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


sqlite CC++接口介绍(二)


1.1 核心程序和对象的典型用法

@H_502_28@应用程序用到sqlite@H_502_28@时,通常会在初始化阶段,调用sqlite_open()@H_502_28@函数@H_502_28@来创建一个数据库连接对象。强调的是,sqlite_open()@H_502_28@函数不只是打开已存在的数据库,同时也可以创建一个新的数据库并打开它。尽管,许多应用程序只用到一个数据库连接,但并不意味着应用程序不能多次调用sqlite_open()@H_502_28@来建立多个数据库连接对象,连接至同一个或不同的数据库。有时候,一个多线程的应用程序将为每个线程创建单独的数据库连接。同样强调地是,为连接到两个或更多的数据库,并不需要创建分开的数据库连接对象。

@H_502_28@一个数据库连接对象使用sql@H_502_28@命令 ATTACH@H_502_28@,可以同时访问两个或多个数据库

@H_502_28@许多应用程序在关闭调用sqlite_close()@H_502_28@来销毁数据库连接对象。或比如说,一个应用程序可能在响应菜单File->Open@H_502_28@”操作中,打开数据库连接对象,然后在响应菜单File->Close@H_502_28@”操作中,关闭数据库连接对象。

@H_502_28@应用程序按照如下步骤执行sql@H_502_28@命令:

  1. @H_502_28@使用sqlite3_prepare()@H_502_28@函数创建预编译语句对象。

  2. @H_502_28@通过调用一次或多次sqlite3_step()@H_502_28@函数,来执行预编译语句。

  3. @H_502_28@在两次调用sqlite3_step()@H_502_28@之间,通过调用sqlite3_column()@H_502_28@来提查询的结果。

  4. @H_502_28@调用sqlite3_finalize()@H_502_28@来销毁预编译语句对象。

@H_502_28@为有效使用sqlite@H_502_28@,上述内容每个人都应该了解。其余内容,只是辅助内容和细节。

2.0 核心程序的易用封装

@H_502_28@接口函数sqlite3_exec()@H_502_28@即为核心程序的一个易用封装。调用函数,即可执行上述的四个步骤。给sqlite3_exec()@H_502_28@传递一个回调函数,使用该回调函数来处理结果集中的每一行。另一个易用封装函数sqlite3_get_table()@H_502_28@,同样执行上述四个步骤。接口函数sqlite3_get_table()@H_502_28@与sqlite3_exec()@H_502_28@的区别是,其将查询结果存在内存堆结构中,而不是调用回调函数

@H_502_28@要重点意识到的是:无论是sqlite3_exec()@H_502_28@还是sqlite3_get_table()@H_502_28@,都不能完成核心程序的全部功能。事实上,这些封装也只不过是由核心程序组成的。

3.0 绑定变量和预编译语句的重复利用

{@H_502_28@可参阅附录1}

@H_502_28@在前面的讨论中,假定每条sql@H_502_28@命令预编译一次,执行,然后销毁。然而,sqlite@H_502_28@允许一个预编译语句对象被执行多次。使用如下函数来实现该功能

  • sqlite3_reset()

  • sqlite3_bind()

@H_502_28@一条通过sqlite3_step()@H_502_28@,被执行一次或多次后的@H_502_28@预编译语句对象,@H_502_28@可以通过调用sqlite3_reset()@H_502_28@对其进行重置。相比创建一个新的预译语句,对预编译语句调用sqlite3_reset()@H_502_28@进行重置,可以避免不必要的sqlite3_prepare()@H_502_28@调用

@H_502_28@对于很多的sql@H_502_28@命令,运行sqlite3_prepare()@H_502_28@对命令进行解析的时间,等于或者超过运行sqlite3_step()@H_502_28@所需的时间。故,避免调用sqlite3_prepare()@H_502_28@会获得一个显著地性能提高。

@H_502_28@通常,尽管,并不需要执行一条完全一样的sql@H_502_28@命令超过一次。更多的时候,某应用需要执行相似的命令。如,你可能需要多次执行一条插入命令,每次插入不同的值。为了适应这种灵活性,sqlite@H_502_28@允许sql@H_502_28@命令包含变量,该变量将在执行前绑定为相应的值。后续,这些值可以被改变,可以用新值再次执行预编译语句。

@H_502_28@在sqlite@H_502_28@中,在任何地方包含字符串都是有效的,可以以如下形式使用通配符。

  • ?

  • ?NNN

  • :AAA

  • $AAA

  • @AAA

@H_502_28@在上面的举例中,NNN@H_502_28@是一个整型数值,AAA@H_502_28@是一个标识符。变量在第一次调用sqlite3_step()@H_502_28@前以及调用sqlite3_reset()@H_502_28@后,其初始为无效值。应用程序可以调用接口函数sqlite3_bind()@H_502_28@将变量赋值。对于同一个变量,每次调用sqlite3_bind()@H_502_28@,将用新值取代旧值。

@H_502_28@允许应用程序预先准备多个预编译的sql@H_502_28@命令,在需要时执行相应的命令。对于未执行的预编译对象,没有任何数量上的限制。

4.0 配置sqlite

@H_502_28@对于大部分应用来说,默认配置,sqlite@H_502_28@就@H_502_28@能很好地工作。但有时,开发者想要对程序稍加调整,以挤出多一点的性能,或使用sqlite@H_502_28@隐藏的特性。

sqlite3_config()@H_502_28@接口程序用于对sqlite@H_502_28@的配置进行全局的,进程范围内有效的更改。sqlite3_config()@H_502_28@接口函数必须在创建任何数据库连接前调用sqlite3_config()@H_502_28@接口函数允许程序员做类似如下操作:

  • @H_502_28@调整sqlite@H_502_28@的内存分配方式,包括设置选择为高安全性、实时的嵌入式系统设计的内存分配程序,或程序默认的内存分配置程序。

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

  • @H_502_28@指定应用程序定义的页缓存。

  • @H_502_28@对于各种线程模型,调整互斥对象的使用,或者用程序自定义的互斥系统代替。

@H_502_28@在进程范围配置完成以及数据库连接对象创建后,对于数据库连接对象个体,则可以调用sqlite3_limit()and sqlite3_db_config()@H_502_28@来配置。

5.0 sqlite扩展

sqlite@H_502_28@具有能够扩展其功能的接口函数,这些程序包括

  • sqlite3_create_collation()

  • sqlite3_create_function()

  • sqlite3_create_module()

  • sqlite3_vfs_register()

sqlite3_create_collation()@H_502_28@接口函数用于给文本排序创建一个新的排序序列。sqlite3_create_module()@H_502_28@接口函数用于注册一个新的虚拟表实现。sqlite3_vfs_register()@H_502_28@接口函数创建新的VFSessqlite3_create_function()@H_502_28@接口函数用于创建一个新的sql@H_502_28@功能,无论标量函数或合计函数{ Aggregate functions,Scalar functions@H_502_28@是sql@H_502_28@的基本函数类型。}@H_502_28@典型地,用如下几个附加的接口函数来实现新sql@H_502_28@功能

  • sqlite3_aggregate_context()

  • sqlite3_result()

  • sqlite3_user_data()

  • sqlite3_value()

sqlite@H_502_28@的所有内置sql@H_502_28@功能正是利用如上相同的接口函数创建的。参阅sqlite@H_502_28@的源供码,尤其是源文件date.c@H_502_28@和func.c@H_502_28@。

@H_502_28@共享库或DLLs@H_502_28@可以作为sqlite@H_502_28@的可加载扩展。

6.0 其它接口

@H_502_28@本文档只涉及基础的sqlite@H_502_28@接口。sqlite@H_502_28@库包括其它许多用于实现有用功能的接口函数,这些接口函数在此并没有讨论。sqliteC/C++ Interface Specification@H_502_28@给出了sqlite@H_502_28@库的全部函数列表。参阅该文档以获得sqlite@H_502_28@接口函数全面且权威的信息。

猜你在找的Sqlite相关文章