分类: 数据库开发技术
2011-04-30 08:46:03
1、SQLite的核心对象和接口
SQL数据库引擎的主要任务是计算SQL表(evaluate statements of SQL),为完成这个任务需要两个对象:
数据库连接(database connection)对象:sqlite3
预处理语句(prepared statement)对象:sqlite3_stmt,严格来说由于sqlite3_exec或sqlite3_get_table封装并隐藏了表编辑对象,所以表编辑并不是必须的。这两个对象由下列一些C/C++接口函数来控制:
sqlite3_open()用来打开到SQLite数据库文件的连接并返回数据库连接(database connection)对象,此接口函数是数据库连接(database connection)对象的构造器。许多SQLite接口需要一个指向数据库连接(database connection)对象的指针作为他们的第一个参数。sqlite3_open()既可以用来打开一个已存在的数据库文件,也可以用来创建并打开一个新的数据库文件。如果需要打开多个数据库也没有必要多次调用sqlite3_open()来创建多个数据库连接,用ATTACH SQL命令可以让一个数据库连接同时访问多个数据库;
sqlite3_prepare()此接口函数将SQL文本转换为预处理语句(prepared statement)对象,并返回指向转换结果的指针。此接口需要sqlite3_open()创建的数据库连接(database connection)对象指针和包含SQL语句的字符串,此函数只是转换SQL语句而不执行。推荐使用sqlite3_prepare_v2()来代替sqlite3_prepare();
sqlite3_step()此接口函数用来对由sqlite3_prepare()创建的预处理语句(prepared statement)对象求值,执行一次返回一行结果集,连续地调用知道语句执行完毕。如果是没有执行结果的语句(比如:INSERT,UPDATE,DELETE)则只需调用一次sqlite3_step();
sqlite3_column()从sqlite3_step()执行后得到的结果集的当前行中取得一列,每当sqlite3_step()得到一行新结果而停止时就能通过调用多次sqlite3_column()取得这行结果中的所有列,SQLite有一系列sqlite3_column_取得结果集中值的函数,这些函数可以用来取得结果的大小和结果的列数目
·
· ;
sqlite3_finalize()用来释放由sqlite3_prepare()创建的预处理语句(prepared statement)对象的内存,为了防止内存溢出每个预处理语句(prepared statement)对象使用完毕后必须要用sqlite3_finalize()来释放;
sqlite3_close()关闭前面通过调用sqlite3_open()打开的数据库连接(database connection),在关闭此连接之前,必须释放与此连接有关的预处理语句(prepared statement)对象;
这六个函数和两个对象构成了SQLite的核心功能。一个应用程序可以在初始化时调用sqlite3_open()来打开一个数据库连接,然后在关闭时通过调用sqlite3_close()来关闭这个连接。其中对SQLite的控制一般可以通过以下的步骤来实现:
A、 调用sqlite3_prepare()来创建一个prepared statement对象;
B、 调用sqlite3_step()一次或多次来执行prepared statement对象,实现对数据库的操作;
C、 在两次调用sqlite3_step()之间调用sqlite3_column_()一次或多次来查询,提取结果;
D、 调用sqlite3_finalize()来释放prepared statement对象的内存。
SQLite还提供了一个更便捷的函数:sqlite3_exec(),这个函数将核心操作的这四个步骤封装成了一个接口,通过传递一个回调函数给sqlite3_exec()来处理结果集中的每一行数据;另一个便捷函数是:sqlite3_get_table(),此函数也完成这四个步骤。这两个函数的不同在于sqlite_get_table()将查询结果保存在堆中,而sqlite3_exec()是通过调用回调函数来处理查询结果。当然这两个函数都无法完成任何核心操作不能完成的事情,他们只是对核心操作的一种封装,是一种快捷方式。
在前面的讨论中我们都假设每个SQL语句都只预处理(prepared)一次,然后执行,销毁。其实SQLite允许同一个预处理语句(prepared statement)执行多次。SQLite提供了两个函数来实现这一功能:
sqlite3_reset();
sqlite3_bind();
在一个预处理语句(prepared statement)被执行(通过调用sqlite3_step()执行)一次或多次后通过调用sqlite3_reset()来重置此预处理语句(prepared statement)可使此语句能被再次执行。这样就不必再次调用sqlite_prepare()来生成一个新的预处理语句(prepared statement),避免了对sqlite_prepare()函数的不必要的调用,而且一般来说对sqlite_prepare()的调用次数等于或多于对sqlite3_step()的调用次数,用sqlite3_reset()来代替sqlite_prepare()对优化性能有重大的意义。
当然将完全相同的一条语句执行多次是没有多大用处的,多数情况下,你可能需要用某一命令对不同的数据执行多次,比如:用INSERT插入多个不同的数据。SQLite允许SQL语句包含参数,再被执行之前再绑定到数据上。
SQLite还包含一些扩展用的函数接口:
sqlite3_creat_collation();
sqlite3_creat_function();