An Introduction To The SQLite C/C++ Interface

来源:互联网 发布:淘宝旺铺专业版 编辑:程序博客网 时间:2024/05/16 09:45

原文链接 http://www.sqlite.org/cintro.html

  本文简单介绍有关C/C++访问SQLITE的接口。

  早期的SQLITE版本非常简单,只有5个访问接口。随着SQLITE的不断完善,新的接口也不断添加;现在已经有185个访问接口。对一个新的程序员来说要了解这么多接口也不容易。幸运的是大多数接口都是很专业的并且很少使用。尽管有这么多的API,但是核心API还是比较简单易懂的。本文的目标是让开发者能够快速的理解SQLITE是如何工作的。

  另一份文档C/C++开发接口将详细介绍C/C++的相关API。一旦读者理解了操作SQLITE的基本原理,另一篇文章可以作为参考指南。本文只是对SQLITE API的大概介绍,不是一份详细的API开发指南。

1.0核心接口

最重要的SQL数据库引擎是statements,为了实现这个目的,开发者需要了解两个重要对象。

数据库连接对象sqlite3。

预声明对象sqlite3_stmt。

严格意义说预声明对象并非必需的接口,sqlite3_exec() 和  sqlite3_get_table()函数对sqlite3_stmt进行了一定程度的封装。但是了解sqlite3_stmt对使用sqlite数据是非常必要的。

sqlite3, sqlite3_stmt主要和以下几个函数有关系,

    sqlite3_open()
    sqlite3_prepare()
    sqlite3_step()
    sqlite3_column()
    sqlite3_finalize()
    sqlite3_close()

上面6个函数和sqlite3sqlite3_stmt两个对象是SQLITE开发的核心。开发者理解了它们就可以进行sqlite开发了。

这6个函数有很多的版本,所以理解起来也不是很容易。例如函数 sqlite3_open()在实际使用时会有不同的实现,sqlite3_open(), sqlite3_open16(),  sqlite3_open_v2().会有3个版本。sqlite3_column()也会根据数据类型的不同会有不同的版本。

这6个函数的功能如下:

sqlite3_open()主要用来打开数据库并返回一个数据库连接对象。必须首先调用该函数后才能使用其他的Sqlite API.许多Sqlite接口都需要sqlite3对象指针作为他们的第一个参数。这个函数的主要作用就是构造一个新的sqlite3连接对象。

sqlite3_prepare() 该函数将SQL脚本预编译为一个sqite3_stmt对象,该函数需要前面提到的sqlite3_open()创建的连接对象以及一个包含SQL脚本的字符串作为参数。在新的应用程序不推荐使用该函数,而应该使用sqlite3_prepare_v2()函数。

sqlite3_step() 这个函数用来执行前面通过预编译生成的sqilite3_stmt,该函数只返回查询结果的第一行。要想获取后续结果需要再次调用该函数,INSERT, UPDATE, DELETE这几类sqlite3_stmt不会返回多条结果只返回单条结果。

sqlite3_column() 该函数用于获取查询结果的某一列数据。每次执行sqlite3_step()都会返回一行新的数据,通过调用sqlite3_column()函数就会得到当前行的相关列的数据。根据不同的数据类型,该函数会有如下几个类型

  • sqlite3_column_blob()
  • sqlite3_column_bytes()
  • sqlite3_column_bytes16()
  • sqlite3_column_count()
  • sqlite3_column_double()
  • sqlite3_column_int()
  • sqlite3_column_int64()
  • sqlite3_column_text()
  • sqlite3_column_text16()
  • sqlite3_column_type()
  • sqlite3_column_value()
sqlite3_finalize() 当不再使用sqlite3_stmt对象后,需要调用该函数释放sqlite3_stmt相关的资源。

sqlite3_close() 当数据库不再使用时则应该调用该函数释放数据库链接所占用的资源,在关闭数据库之前需要先释放所有sqlite3_stmt所占用的资源。

1.1标准的数据库内核对象及函数使用方法

如果你的应用程序需要使用sqlite管理数据首先在初始化时需要调用sqlite3_open()创建一个数据库链接,调用该函数会打开一个已存在的数据库文件或创建一个新的数据库文件。如果一个应用有多个线程需要使用数据库则需要为每个现在创建自己的数据库链接。当访问多个数据并不需要创建多个数据库链接,通过使用ATTACH命令可以一个数据库链接同时访问多个数据库。

要使用sqlite3_stmt,你的应用需要进行如下几步。

1. 调用sqlite3_prepare()创建一个sqlite3_stmt.

2.调用sqlite3_step()执行相关的sql语句.

3.调用sqlite3_column()获取相关的结果.

4.使用完sqlite3_stmt后需要调用sqlite3_finalize()销毁其占用的相关资源。

上面介绍的内容是使用sqlite数据必须要掌握的。

2.0其他相关函数的介绍

函数sqlite3_exec()可以很方便的完成上面4个步骤的操作,将一个回调函数传递给sqlite3_exec()用于处理查询结果的每一行。sqlite3_get_table()是另一种以上4种方式的替代品。sqlite3_get_table()不同于sqlite3_exec(),sqlite3_exec()将所有结果存放在堆内存中而不是通过回调函数来获取。

3.0 对sqlite_stmt绑定参数和重用.

在前面的讨论中,每个sqlite3_stmt预编译一次,执行,然后销毁。然而sqlite允许sqlite3_stmt执行多次,通过如下步骤实现。
  • sqlite3_reset()
  • sqlite3_bind()

当一个预编译的sqlite3_stmt通过调用sqlite3_step()执行多次后,可以调用sqlite3_reset()对sqlite3_stmt进行重置后可以再次拿来使用。

通常多次对同一个sqlite3_stmt执行查询操作是无用的,但是我们去希望对同一个sqlite3_stmt执行操作。例如你想调用一个INSERT的sqlite3_stmt多次插入不同的值。要实现这种灵活的方式,sqlite可以使用带参数的sqlite3_stmt,在下次执行的时候可以绑定一个新的值。

在sqlite3中可以使用如下几种方式作为参数占位符。

  • ?
  • ?NNN
  • :AAA
  • $AAA
  • @AAA
上面的格式种,"NNN"是一个整数值,“AAA”是一个标志符.参数一开始为NULL,在调用sqlite3_step()之前或者sqlite3_reset()之后,应用程序可以调用某个sqlite3_bind()函数将值绑定给参数。一个应用程序可以预先编译好很多sqlite3_stmt然后在需要的时候执行。

4.0 扩展API

SQLITE提供以下接口可以扩展他的函数。

  • sqlite3_create_collation()
  • sqlite3_create_function()
  • sqlite3_create_module()
sqlite3_create_collation()主要用于创建一个新的排序方式,sqlite3_create_module()函数用于注册一个新的虚表。sqlite3_create_function()用于创建一个新的SQL函数,如数值计算或者聚合函数。一个新函数的实现需要如下几个接口

  • sqlite3_aggregate_context()
  • sqlite3_result()
  • sqlite3_user_data()
  • sqlite3_value()
所有的内置SQL函数也是通过如上接口实现的。可以查看源码date.c ,func.c中相关函数的实现方式。

5.0 其他接口介绍

本文只讨论一些基础的sqlite接口。sqlite还包含许多其他的接口这里就不详细讨论,读者可以参考完整的函数列表




原创粉丝点击