嵌入式系统原理与技术课件:3-SQLITE.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《嵌入式系统原理与技术课件:3-SQLITE.ppt》由用户(罗嗣辉)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 原理 技术 课件 SQLITE
- 资源描述:
-
1、嵌入式创新实验 华中农业大学 计算机系 倪福川嵌入式数据库简介-SQLite嵌入式创新实验华中农业大学 计算机系 倪福川纲要SQLite介绍SQLite的发展、优势、缺憾 部结构SQLite数据库的使用SQLite的命令行接口 、SQLite命令行使用SQLite数据库的编程接口C/C+接口简单应用 自定义简单函数自定义聚合函数 自定义排序函数SQLite数据库在ASTRAL中的应用SQLite在多级关联中的应用 SQLite在IPIS中的应用 SQLite在web中的应用嵌入式创新实验华中农业大学 计算机系 倪福川SQLite介绍SQLite的发展 2000年由D.Richard Hipp开
2、始开发2001年发布2.0v2004年发布3.0v(采用了不同的数据文件格式以及编程接口)目标易于管理、操作、维护、自定义以及提供易用的编程接口嵌入式创新实验华中农业大学 计算机系 倪福川SQLite介绍SQLite的优势内存占用量小比MySQL(2倍), PostgreSQL(20倍)快ACID兼容(原子性,一致性,独立性,可持久性),支持视图,子查询,触发器单个库文件中包含数据库引擎与接口,且其运行不依赖其它库可以将数据放进单个文件为C/C+, Perl,PHP等应用提供了接口免费允许为SQL命令集动态添加自定义函数(简单函数及聚集函数),而无需重编SQLite库嵌入式创新实验华中农业大学
3、 计算机系 倪福川SQLite介绍SQLite的 缺点事务处理并发性 SQLite通过数据库级上的独占性和共享锁来实现独立事务处理,这意味着当多个进程或线程在同一时间可以从数据库读取数据,但是只能有一个可以同时写入,在写入之前,必须获得独占锁,其它的读操作不允许发生。性能 在创建索引( CREATE INDEX)和删除表( DELTE TABLE)时明显比其它数据库慢用户管理/安全 数据库的访问是基于操作系统对文件的控制来控制的,不能通过用户来区分数据库中的不同数据库. 举例,将数据库文件去写权限,然后向其中插入或删除数据条目,将提示写失败。但是不能通过数据库本身的来对权限进行设置。 在网上已
4、经有一些SQLite的安全问题的解决方案,但大多数是商业化的,有些提供在整个数据库上的加密,有些提供在数据级别的加密。比如secure SQLite之类。嵌入式创新实验华中农业大学 计算机系 倪福川SQLite的内部结构在内部,SQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。所有 SQL 语句都被编译成易读的、可以在 SQLite 虚拟机中执行的程序集。1、接口将SQL语句传给SQL编译器2、SQL编译器选将SQL分解成为Token3、将Token传递给解析器进
5、行解析、由代码生成器生成虚拟机代码、由虚拟机执行生成的程序6、SQLite库在磁盘上以B树形式组织(每个表和索引都有自己单独的B树,所有的B树都保存的同一个文件里面)7、OS层的操作大多数的SQL内建函数可以在func.c, date.c里面找到。用户自定义函数编写可以参考这里面的实现。无论内内建函数还是用户自定义函数都是用C的回调方式实现(稍后再做介绍)嵌入式创新实验华中农业大学 计算机系 倪福川SQLite数据库的使用SQLite命令行接口SQLite除库本身外,还包含命令行接口,可以在$SQLITE_HOME/bin下发现sqlite/sqlite3,命令行功能介绍运行方式:sqlite
6、 DBFile得到提示符sqlite运行.help(注意sqlite命令行提供的命令都以”.”开头,可以看到sqlite命令行接口提供下面的功能.嵌入式创新实验华中农业大学 计算机系 倪福川SQLite命令行功能简介SQLite命令行功能简介DML/DDL语句的使用和以前一致,不做介绍.databases 列出数据库文件名.tables ?PATTERN? 列出?PATTERN?匹配的表名.import FILE TABLE将文件中的数据导入的文件中.dump ?TABLE? 生成形成数据库表的SQL脚本.output FILENAME 将输出导入到指定的文件中.output stdout 将
7、输出打印到屏幕.mode MODE ?TABLE? 设置数据输出模式(csv,html,tcl.nullvalue STRING 用指定的串代替输出的NULL串.read FILENAME执行指定文件中的SQL语句.schema ?TABLE? 打印创建数据库表的SQL语句 .separator STRING 用指定的字符串代替字段分隔符.show 打印所有SQLite环境变量的设置.quit 退出命令行接口嵌入式创新实验华中农业大学 计算机系 倪福川SQLite命令行功能使用SQLITE命令行的常规使用:SQLite数据导入创建数据文件这个文件可能来自其它的其它程序的输出之类,现只我们手功创
8、建下面的数据文件data.txt(用逗号分隔):id, name,gender, age1,dq,male,242,jz,female,273.pp,male,264,cj,male,285,zc,male,25创建数据库表1.五种数据类型 TEXT,NUMERIC,INTEGER,REAL,NONE2.数据类型的转换 向保存的目标类型转换,如将text保存到integer,则试着将文件转为数字(int或float),如果转换失败,则做为文件保存.3.数据库表创建 shell sqlite3 test.dbsqlite create table employee( id integer pri
9、mary key, name text, gender text, age integer );嵌入式创新实验华中农业大学 计算机系 倪福川SQLite命令行功能使用数据导入sqlite.import data.txt employeesqlite提示:data.txt line1:expected 4 coloumns of data but found 1;从经验应该能看出是字符分隔符有问题,先来看看系统用什么样的提示符:.show之后可以看到 separator: “|”,也就是说系统默认的分隔符为”|”面不是”,”,下面修改分隔字符:sqlite.separator “,” sqlit
10、e.import data.txt employeesqlite select * from employee where id 2;sqlite select * from employee where name 9999999999999;上面这句用来说明textinteger(这个和比较字符的内码得到的结果是相同的)数据比较1.NULLINTERGER(REAL)TEXT select id 2, name dong, gender=male from employee;0,1,10,1,01,1,11,0,11,1,1嵌入式创新实验华中农业大学 计算机系 倪福川SQLite命令行功能使
11、用下面举例说明SQLITE命令行的常规使用:SQLite数据导出将数据表导出为数据创建脚本sqlite .dump employee 上面的命令可以得到数据表相关的SQL语句,为了将输出保存的文件中,执行下面的命令。sqlite .output create.sqlsqlite .dump employeesqlite .output stdout(将输出恢复到标准输出)(将输出恢复到标准输出)将特定数据导出成数据文件sqlite .output data_tmp.htmlsqlite select * from employee;sqlite .mode html employeesqlit
12、e select * from employee;sqlite .output stdout上面的几条命令将employee中的数据以html 的格式保存到data_tmp.html中.shell sqlite test.db “.dump” | sed e s/dq/dongqiang/ | sqlite3 test2.db上面的命令行操作将test.db中的dq全部替换为dongqiang然后导入test2.db中n创建索引 create index employee_ID on employee( id );n创建触发器create Trigger insert_trigger AFTE
13、R INSERT ON employeeBEGIN /动作,比如记数,修改时间等END嵌入式创新实验华中农业大学 计算机系 倪福川SQLite的编程接口简介SQLite3 C/C+常见接口int sqlite3_open();/数据库的打开,包括文件和内存数据库两种(:memory).int sqlite3_close(); /数据库的关闭long long int sqlite3_last_insert_rowid(sqlite3*);/最后插入的数据的行号long long int sqlite3_progress_handler(sqlite3*);/查询的进度,参数为空删除进度信息(实
14、验中)SQLite3的不同执行方式执行一行或多行SQL语句并在查询结果的每一行上执行回调函数int sqlite3_exec();动态构造SQL语句char *sqlite3_mprintf(const char*,.);char *sqlite3_vmprintf(const char*, va_list);/构造语句,由sqlite3_exec执行int sqlite3_exec_printf();/构造查询语句,并执行void sqlite3_free(char *z); /释放sqlite3_(v)mprintf分配的内存预编译SQL语句,减少SQL分析的时间int sqlite3_p
15、repare(); /预编译int sqlite3_step(sqlite3_stmt*); /执行一次,或者多次Int sqlite3_reset( sqlite3_stmt*); /重置sqlite3_stmt(来自sqlite3_prepare()int sqlite3_finalize(sqlite3_stmt *pStmt); /释放利用对sqlite3_exec()的封装,返回所有的查询结果int sqlite3_get_table();void sqlite3_free_table(char *result);嵌入式创新实验华中农业大学 计算机系 倪福川SQLite的编程接口简单
16、应用 SQLite的简单使用举例,去除了对异常处理部分。主函数分析:int main(int argc, char* argv) sqlite3 * db = NULL; char* zErrMsg = NULL; int rc; sqlite3_open( “:memory:”, &db ); /打开内存数据库rc = sqlite3_exec(db, “create table employee(id integer primary key, age integer);”, NULL, 0, &zErrMsg);/创建数据库 for( int i= 0; i 10; i+ ) statem
17、ent = sqlite3_mprintf( insert into employee values(%d, %d);”, NULL, 0, &zErrMsg, rand()%65535, rand()%65535 );rc = sqlite3_exec( db, statement, NULL, 0 , 0 );/插入数据 sqlite3_free( statement ); rc = sqlite3_exec(db, “select * from employee;” , callback, 0, &zErrMsg );/查询,并调用回调函数 sqlite3_close(db);嵌入式创新
18、实验华中农业大学 计算机系 倪福川SQLite的编程接口简单应用回调函数int calltimes = 0; static int callback(void* notused, int argc, char* argv, char* azColName) int i; calltimes+; for(i=0; i select * from employee where id=min( 1, ,2, 3, 4,5);sqlite select * from employee where id=min(1);/min()是aggragate func作为表达式SQL Error: misuse
19、 of aggregate function main()sqlite select min(1) from employee;嵌入式创新实验华中农业大学 计算机系 倪福川SQLite的自定义简单函数接口用户自定义函数接口int sqlite3_create_function(); 该函数用于注册/删除用户自定义函数。自定义函数传递参数有两种方式,第一种是在注册时用pUserData传入,第二种是在调用已经注册函数时传入参数。void (*func)(sqlite3_context*,int,sqlite3_value*); 用户自定义函数的格式,第二个参数是自定函数的参数个数,第三个函数是自
20、定义函数的值。void *sqlite3_user_data(sqlite3_context*); 返回用户注册函数时传入的参数void *pUserData。int sqlite3_value_type(sqlite3_value*); 用来说明sqlite3_value的数据类型,比如用户自已定义的回调函数的第二个参数的数据类型。sqlite3_value_XXXX(sqlite3_value*); 用来返回sqlite3_value所表示的准确值。sqlite3_result_XXXX(sqlite3_context*, .); 用来设置返回值为某一数值的准确拷贝。对上面的内容更详细的介
21、绍将放在利用自定义接口编程的部分进行说明。对聚合函数及排序函数的接口介绍也推后介绍。嵌入式创新实验华中农业大学 计算机系 倪福川SQLite的自定义函数编程接口int sqlite3_create_function( sqlite3 *, /数据库句柄数据库句柄const char *zFunctionName, /自定义函数的名子自定义函数的名子int nArg, /参数个数,参数个数,-1表示任意个数的参数表示任意个数的参数int eTextRep, /函数接受的参数数据类型函数接受的参数数据类型void *pUserData, /在函数实现中用在函数实现中用sqlite_user_dat
展开阅读全文