【手机平台项目学习和分析】SQLite3包的使用经典学习资料
SQLite简介
SQLite是一款轻量级数据库,是遵守ACID的关联式数据库管理系统.它的设计目的是嵌入式。目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百KB的内存就够了。它能够支持Windows/Linux/Unix/Android等等主流的操作系统,同时能够跟很多程序语言相结合,比如 C/C++,Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite的版权允许无限制地应用,不用支付任何使用和授权费用,已经成为了最受欢迎的开源数据库之一。SQLite网站(www.sqlite.org)同时提供SQLite的已编译版本和源程序。 SQLite的特性:
缺点:并发性差,没有固定的事务日志,保密安全性不强。 SQLite 简介: SQLite是D.Richard Hipp于2000年开发出来的一个自容纳、可嵌入、零配置数据库引擎 的小型数据库。它支持多数SQL92标准。SQLite3.0的C编程一共涉及到83个API函数,此外还有一些数据结构和预定义。这些接口的使用一般都不复杂,最简单的程序只要三个函数就可以完成:sqlite3_open(),sqlite3_exec() 和sqlite3_close() 。如果想更好地控制数据库引擎的执行, 可以使用sqlite3_prepare()函数把SQL语句编译成字节码,然后再使用sqlite3_step()来执行编译好的字节码,以sqlite3_column_xxx()表示的一组函数来获取查询结果集中的信息,其中xxx代表返回数值的数据类型,如int、text、blob,real等。 对于程序员来说,SQLite就象一个数据传送带,提供了一种方便的将应用程序绑定的数据的方法。你可以操作互相关联的数据,可以完成很繁重的任务不必写自己的算法来对数据结构操作和排序。 SQLite 的应用: SQLite已经被多种软件和产品所使用: Apple的Mac OS X操作系统; Safari的Web浏览器; Mail.app的电子邮件程序、RSS的管理; Apple的Aperture照片软件; Adobe的AIR; Google 的android; 从这些说明它的健壮性、稳定性等方面不会有太大问题。 SQLite 的结构原理: SQL语句编译器(Complier)由词法处理器( Tokenize) 、句法分析器( Parser)和代码生成器(Code generator) 组成。执行SQL 语句时,由接口把包含该SQL 语句的字符串传给词法处理器进行词法分析处理,把字符串分成一个一个的词法单元,然后把处理结果再传递句法分析器进行语法分析,它调用代码生成器产生能够在虚拟机(Virtual Machine) 上执行的指令码。 VirtualMachine 是为操作数据库文件而执行的一个抽象的计算机引擎,又称虚拟数据库引擎(VDBE),它是SQLite的核心.在SQL语句被分析之后,代码生成器将生成用VDBE的虚拟机器语言表示的一系列指令。如此反复,VDBE执行每条指令,最终完成SQL语句指定的查询,删除,存储等请求。 B - Tree,是SQLite实现数据存储的模式,每个表和索引使用单独的B -Tree,有助于的查找减到最小,快速有效。Pager Cache 对数据块读写提供高速缓冲,同时也提供回退、原子操作及对数据库文件加锁,通过缓冲机制,可以避免频繁进行I/O操作而降低应用程序的性能。
1.sqlite3_open() 连接数据库用sqlite3_open()函数,它们的声明如下 int sqlite3_open( const char *filename,/* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 在执行SQL命令之前,首先要连接数据库。因为SQLite数据库存储在一个单独的操作系统文件当中,所以连接数据库可以理解为“打开”数据库。filename不为空,先尝试打开,如果文件不存在,则用这个名字创建一个新的数据库。 2.sqlite3_close() 关闭连接使用sqlite3_close()函数,它的声明如下: int sqlite3_close(sqlite3* ppDb); 为了sqlite3_close()能够成功执行,所有与连接所关联的已编译的查询必须被定案。如果仍然有查询没有完成,sqlite3_close()将返回SQLITE_BUSY和错误信息 3. sqlite3_exec()
int sqlite3_exec( sqlite3*,/* An open database */ const char *sql,/* SQL to be executed */ sqlite_callback,/* Callback function */ void *data /* 1st argument to callback function */ char **errmsg /* Error msg written here */ ); SQL命令由sql参数提供,它可以由多个SQL命令构成,sqlite3_exec()会对其中每个命令进行分析并执行,直到命令串结束或遇到一个错误。 列表6-1 对简单的命令使用sqlite3_exec() #include <stdio.h> #include <stdlib.h> #include "util.h" #pragma comment(lib,"sqlite3.lib") int main(int argc,char **argv) { sqlite3 *db; char *zErr; int rc; char *sql; rc = sqlite3_open("test.db",&db); if (rc) { fprintf(stderr,"Can't open database: %sn",sqlite3_errmsg(db)); sqlite3_close(db); exit(1); }
sql = "create table episodes( name text,id int)"; rc = sqlite3_exec(db,sql,NULL,&zErr); if (rc != SQLITE_OK) { if (zErr != NULL) { fprintf(stderr,"SQL error: %sn",zErr); sqlite3_free(zErr); } } sql = "insert into episodes (name,id) values ('Cinnamon Babka2',1)"; rc = sqlite3_exec(db,zErr); sqlite3_free(zErr); } } sqlite3_close(db); return 0; }
int sqlite3_prepare( sqlite3 *db,/* Database handle */ const char *zSql,/* SQL statement,UTF-8 encoded */ int nByte,/* Maximum length of zSql in bytes. */ sqlite3_stmt **ppStmt,/* OUT: Statement handle */ const char **pzTail /* OUT: Pointer to unused portion of zSql */ ); 跟sqlite3_exec()相似,sqlite3_prepare()也可以接受一个SQL语句的字符串查询 #include <string.h> int main(int argc,char **argv) { int rc,i,ncols; sqlite3 *db; sqlite3_stmt *stmt; char *sql; const char *tail; rc = sqlite3_open("test.db",&db); if(rc) { fprintf(stderr,sqlite3_errmsg(db)); sqlite3_close(db); exit(1); }
sql = "select * from episodes;"; rc = sqlite3_prepare(db,(int)strlen(sql),&stmt,&tail); if(rc != SQLITE_OK) { fprintf(stderr,sqlite3_errmsg(db)); }
rc = sqlite3_step(stmt); ncols = sqlite3_column_count(stmt); while(rc == SQLITE_ROW) { for(i=0; i < ncols; i++) { fprintf(stderr,"'%s' ",sqlite3_column_text(stmt,i)); } fprintf(stderr,"n"); rc = sqlite3_step(stmt); } sqlite3_finalize(stmt); sqlite3_close(db); return 0; } 每次调用sqlite3_step()的时候,只返回一行数据,使用sqlite3_column_XXX()函数来取出这些数据.要取出全部的数据需要反复调用sqlite3_step(). 接口函数返回一些状态参数,主要有几个: |
- oracle 建用户即授权
- ajax – 模拟api in react redux-thunk项目返回undefined
- ruby – 除了Bundler之外,我还应该使用特定于应用程序的RVM
- iPhone SDK – NSStreamEventHasBytesAvailable / appendBy
- c# – 需要帮助理解Microsoft对File.ReadLines和File.ReadA
- ios – 问题AppSubmit有效的配置文件都不允许指定的权利Wat
- c – 同步锁的替代方案
- 完美的Swift中的OAuth 2.0服务器提供程序
- c#生成缩略图代码
- Mono下配置ActiceRecord使用sqlite数据库