SQLite CC++接口介绍
本文为SQLite C/C++接口的介绍。
早期版本的SQLite由于只支持5个C/C++接口,故十分容易学习。随着SQLite功能的增长,新的C/C++接口随之加入,以至有超过200个不同的函数接口(API)。如此多的函数,会对新的使用者带来压力。幸运的是,大多数函数是十分专用的,不需要考虑。尽管有如此多的入口点,但核心的APIS仍然相当简单,易于编程。本文目的在于提供全部背景信息,以更容易理解SQLite是怎么样工作的。
另一篇独立的文档“TheSQLite C/C++ Interface”,描述了全部不同的SQLiteC/C++ APIs。一旦读者理解了SQLite工作的基本原理,该文档可作为参考指南。本文档只是作为介绍,并不是完整的,也不是权威的,SQLiteAPI参考。
1.0核心对象和接口
一个SQL数据库引擎的主要任务是执行SQL语句。为了达到该目的,开发者需要知道两个对象:
-
数据库连接对象:sqlite3
-
预置语句对象:sqlite3_stmt {SQLite引进了虚拟机器概念,参阅之,可以帮助理解预置语句对象。个人翻译为预置语句这个名词时,认为并不能贴切的传达本意。}
严格意义上来讲,预置语句对象并不是必须的了解。因为,可以使用sqlite3_exec或 sqlite3_get_table这样便利的封装接口。这些接口对预置语句对象进行封置,隐藏了预置语句对象。然而,充分利用SQLite,则需要理解预置语句对象。
数据库连接和预置语句对象由一个小型的C/C++接口函数集控制,列出如下:
-
sqlite3_open()
-
sqlite3_prepare()
-
sqlite3_step()
-
sqlite3_column()
-
sqlite3_finalize()
-
sqlite3_close()
上面列出的这六个C/C++接口函数和两个对象构成了SQLite的核心功能。开发者理解了他们,就有了用好SQLite的好基础。
注意:如上列出的函数只是概念上的,而不是实际的。这些列出的函数大都有不同的版本。如,上面只列出了sqlite3_open()这一个函数名,事实上有三个分开的函数以稍微不同的方式完成相同的功能。他们是sqlite3_open(), sqlite3_open16() 和sqlite3_open_v2()。列表中提到的函数sqlite3_column(),事实上并不存在该段程序。列中给出的函数sqlite3_column()代表着一族函数,这些函数可用于提取不同类型的列数据。
如下是这些核心接口作用的概述:
sqlite3_open()
| 该函数打开一个SQLite数据库文件,并建立连接,同时返回一个数据库连接对象。往往,一个应用调用的第一个SQLite API即为该函数。同时,该函数也是大多数其他SQLite API的先决条件。大多数SQLite API需要一个数据库连接对象的指针作为第一个参数同,同时这些SQLite API可以看作为数据库连接对象的成员函数,这些函数共同构建了数据库连接对象。 |
sqlite3_prepare()
| 该函数将SQL文本转换为预置语句对象,同时返回一个指向该对象的指针。该接口函数需要一个先前通过调用sqlite3_open()获得的数据库连接对象的指针以及将要进行转换的SQL语句字符串。该语句事实上并不执行SQL语句。它仅仅是为执行SQL语句做好准备。 假设每条SQL语句即为一个小计算程序。sqlite3_prepare()的目的是将这些程序编译成对象编码。预置语句即为对象编码。sqlite3_step()接口函数将执行对象编码以获得结果。 注意,对于新的应用,并不推荐使用sqlite3_prepare()。一个新的备选函数sqlite3_prepare_v2()用来替代它。 |
sqlite3_step()
| 该函数用来执行先前用sqlite3_prepare()接口创建的预置语句。该语句将执行,直到获得第一行结果。再次调用sqlite3_step()以获得下一行数据。持续调用sqlite3_step(),直到语句完成。若执行没有返回结果的语句(如,insert, update 或 delete语句),只需要调用一次sqlite3_step()即可完成。 |
sqlite3_column() | 该函数从被sqlite3_step()执行的预置语句的当前结果行获得一列数据。每次当sqlite3_step()执行后,通过多次调用该函数,以获得当前行的全部列数据。如上面提到,在SQLite API中并没有sqlite3_column()函数。对应的,我们在些称为sqlite3_column()指代的是一个整族的函数,这些函数从结果集中返回不同数据类型的结果。{请参阅SQLite的弱数据特性}。同时,也有一族的函数用来获得数据的大小(如果是字符串型和二进制大对象)和获得结果集中列的数目。 l sqlite3_column_blob() l sqlite3_column_bytes() l sqlite3_column_bytes16() l sqlite3_column_count() l sqlite3_column_double() l sqlite3_column_int() l sqlite3_column_int64() l sqlite3_column_text() l sqlite3_column_text16() l sqlite3_column_type() l sqlite3_column_value() |
sqlite3_finalize()
| 该函数用于销毁(析构)之前由调用sqlite3_prepare()生成的预置语句对象。每个预置语句对象必须使用sqlite3_finalize()来销毁,以避免内存泄露。 |
sqlite3_close() | 该语句用于关闭由先前调用sqlite3_open()打开的数据库连接。所有与对应连接有关联的预置语句必须在关闭连接前完成。 |