Sqlite3数据库的初步学习

前端之家收集整理的这篇文章主要介绍了Sqlite3数据库的初步学习前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

sqlite3数据库的初步学习

@H_403_5@最近由于项目的需要,初@H_403_5@步学习@H_403_5@了@H_403_5@sqlite3数据库@H_403_5@技术。现共享,希望能与家共同学习。至于深入的学习我将在后继的博客中与大家深入交流。SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备@H_403_5@中应用非常广泛(关注我博客的朋友,就会发现,我的另一篇博客基于Ubuntu-WoojoyQT4mini电话薄设计,其实就一个成功的小案例)@H_403_5@。同样,大家亦可以参考其官网:http://www.sqlite.org

@H_403_5@需要说明的是,我使用的sqlite3中的API大约包括80函数。只有8函数在连接、查询和断开连接时必须的,其它的函数用来完成特定的任务。下我就从基础的函数使用讲起。

@H_403_5@一、创建表

@H_403_5@CREATE[TEMP|TEMPORARY]TABLE

@H_403_5@ 例如:@H_403_5@ @H_403_5@

@H_403_5@char*sql="CREATETABLESensorData(/

@H_403_5@IDINTEGERPRIMARYKEY,/

@H_403_5@SensorIDINTEGER,/

@H_403_5@SiteNumINTEGER,/

@H_403_5@TimeVARCHAR(12),/

@H_403_5@SensorParameterREAL);";

@H_403_5@参数@H_403_5@[TEMP|TEMPORARY]是用来建立临时表用的。大家可以参考相关资料,如需要帮助,也可以在我博客中留言。

sqlite具有以下五种数据类型:

NULL:空值;INTEGER:带符号的整型,具体取决有存入数字的范围大小;REAL:浮点数字,存储为8-byteIEEE浮点数;TEXT:字符串文本;BLOB:二进制对象。

@H_403_5@二、@H_403_5@改变表

@H_403_5@ALTERTABLEtable{RENAMETOname|ADDCOLUMNcolumn_def}

@H_403_5@

@H_403_5@RENAMETOname对表重命名

@H_403_5@ADDCOLUMNcolumn_def增加表行信息;

@H_403_5@执行ALTERTABLE@H_403_5@SensorData

@H_403_5@ADDCOLUMNemailTEXTNOTNULLDEFAULT"COLLATENOCASE;完有:

@H_403_5@char*sql="CREATETABLESensorData(/

@H_403_5@IDINTEGERPRIMARYKEY,/

@H_403_5@SensorParameterREAL@H_403_5@/

@H_403_5@emailTEXTNOTNULLDEFAULT"COLLATENOCASE;@H_403_5@);";

@H_403_5@三、@H_403_5@关系操作

@H_403_5@

@H_403_5@SELECT语法

@H_403_5@

@H_403_5@SELECT语法说明

@H_403_5@ 由于SELECT语句是比较复杂的语句,在此就不细说了。当然,我会在下面的实例中具体用到。

@H_403_5@四、@H_403_5@打开数据库关闭数据库

@H_403_5@Intsqlite3_open(文件名,sqlite3**);

@H_403_5@Intsqlite3_close(sqlite3**);

@H_403_5@五、@H_403_5@执行语句

@H_403_5@(IIntsqlite3_exec(sqlite3*,contchar*sal,sqkite3_callback,void*,char**errmsg):

@H_403_5@这就是一条sql语句的函数

@H_403_5@第1个参数不再说了,是前面open函数得到的指针。

@H_403_5@第2个参数constchar*sql是一条sql语句,以/0结尾。

@H_403_5@第3个参数sqlite3_callback是回调函数,当这条语句执行之后,sqlite3会去调用你提供的这个函数(什么是回调函数,下面我会给出一个例子,助大家来理解)。

@H_403_5@第4个参数void*是你所提供的指针,你可以传递任何一个指针到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,我们可以填NULL

@H_403_5@第5个参数char**errmsg错误信息。注意是指针的指针。sqlite3里面有很多回定的错误信息,执行sqlite3_exec之后,执行失败时可以查阅这个指针(直接printf("%s/n",errmsg))得到一串字符串信息,这串信息告诉你错在什么地方。

@H_403_5@注意:通常,sqlte3_callback和它后面的void*这两个位置都可以真NULLNULL表示你不需要回调。比如你做insert操作,做delete操作,就没有必要使用回调。而当你做select时,就要使用回调,因为sqlite3把数据查出来,得通过回调告诉你查出了什么数据。

@H_403_5@(II)回调函数

@H_403_5@Typedefint(*sqlite3_callback)(voic*,int,char**,char**);

@H_403_5@下面是回调函数一个实例,现与大家共享:

@H_403_5@#include<stdio.h>

@H_403_5@#include<stdlib.h>

@H_403_5@#include"sqlite3.h"

@H_403_5@intcallback(void*data,intncols,char**values,char**headers)

@H_403_5@{

@H_403_5@inti;

@H_403_5@fprintf(stderr,"%s:",(constchar*)data);

@H_403_5@for(i=0;i<ncols;i++)

@H_403_5@{

@H_403_5@fprintf(stderr,"%s=%s",headers[i],values[i]);

@H_403_5@fprintf(stderr,"/n");

@H_403_5@}

@H_403_5@return0;

@H_403_5@}

@H_403_5@intmain(intargc,char**argv)

@H_403_5@{

@H_403_5@sqlite3*db;

@H_403_5@intrc;

@H_403_5@char*sql;

@H_403_5@char*zErr;

@H_403_5@char*data;

@H_403_5@rc=sqlite3_open("test.db",&db);

@H_403_5@if(rc)

@H_403_5@{

@H_403_5@fprintf(stderr,"Can'topendatabase:%s/n",sqlite3_errmsg(db));

@H_403_5@sqlite3_close(db);

@H_403_5@exit(1);

@H_403_5@}

@H_403_5@sql="CREATETABLEta(/

@H_403_5@IDINTEGERPRIMARYKEY,/

@H_403_5@nameVARCHAR(32));";

@H_403_5@rc=sqlite3_exec(db,sql,NULL,&zErr);

@H_403_5@if(rc!=sqlITE_OK)

@H_403_5@{

@H_403_5@if(zErr!=NULL)

@H_403_5@{

@H_403_5@//fprintf(stderr,"sqlerror:%s/n",zErr);

@H_403_5@sqlite3_free(zErr);

@H_403_5@}

@H_403_5@}

@H_403_5@data="Callbackfunctioncalled/n";@H_403_5@

@H_403_5@sql="insertinto/"ta/"values(NULL,'888');";

@H_403_5@sqlite3_exec(db,&zErr);

@H_403_5@sql="select*Fromta;";

@H_403_5@rc=sqlite3_exec(db,callback,data,&zErr);

@H_403_5@if(rc!=sqlITE_OK)

@H_403_5@{

@H_403_5@if(zErr!=NULL)

@H_403_5@{

@H_403_5@fprintf(stderr,zErr);

@H_403_5@sqlite3_free(zErr);

@H_403_5@}

@H_403_5@}

@H_403_5@sqlite3_close(db);

@H_403_5@return0;

@H_403_5@}

@H_403_5@以下是Ubuntu-Woojoy下运行的结果:

@H_403_5@

@H_403_5@虽然回调显得代码整齐,但有时,你还是可想要非回调的select查询。这可以通过下面的函数做到。

@H_403_5@(IIIintsqlite3_get_table(sqlite3*,constchar*sql,char**resultp,int*nrow,int*ncolumn,char**errmsg);

@H_403_5@第1个参数,同上。

@H_403_5@第2个参数是sql语句,跟sqlite3_exec里的sql是一样的。

@H_403_5@第3个参数是查询结果,它依然一维数组(不要以为是二维数组,更不要以为是三维数组)。

@H_403_5@第4个参数是查询出多少条记录(即查出多少行)。

@H_403_5@第5个参数是多个字段(多少列)。

@H_403_5@第6个参数是错误信息,跟前面一样。

@H_403_5@六、@H_403_5@修改数据

@H_403_5@sqlite3主要有2DML语句用于修改数据------INSERT,UPDATE,DELETE

@H_403_5@INSERTINTOtable(column_list)VALUES(value_list);

@H_403_5@UPDATEtableSETupdate_listWHEREpredicate;

@H_403_5@DELETEFROMfoodsWHEREname='';

@H_403_5@七、@H_403_5@下面我们就上面的知识来一个实用例子(在Ubuntu-Woojoy运行通过)

@H_403_5@#include<stdio.h>

@H_403_5@#include<stdlib.h>

@H_403_5@#include"sqlite3.h"

@H_403_5@//#define_DEBUG_

@H_403_5@intmain()

@H_403_5@{

@H_403_5@sqlite3*db=NULL;

@H_403_5@char*zErrMsg=0;

@H_403_5@intrc;

@H_403_5@rc=sqlite3_open("zieckey.db",&db);

@H_403_5@if(rc)

@H_403_5@{

@H_403_5@fprintf(stderr,"can'topendatabase:%s/n",sqlite3_errmsg(db));

@H_403_5@sqlite3_close(db);

@H_403_5@exit(1);

@H_403_5@}

@H_403_5@else

@H_403_5@printf("opendatabase/n");

@H_403_5@char*sql="CREATETABLESensorData(/

@H_403_5@IDINTEGERPRIMARYKEY,/

@H_403_5@SensorIDINTEGER,/

@H_403_5@SiteNumINTEGER,/

@H_403_5@TimeVARCHAR(12),/

@H_403_5@SensorParameterREAL);";

@H_403_5@//@H_403_5@ @H_403_5@printf("OK,%d/n",__LINE__);

@H_403_5@sqlite3_exec(db,&zErrMsg);

@H_403_5@//@H_403_5@ @H_403_5@printf("OK,__LINE__);

@H_403_5@#ifdef_DEBUG_

@H_403_5@printf("%s/n",zErrMsg);

@H_403_5@#endif

@H_403_5@//@H_403_5@ @H_403_5@printf("OK,__LINE__);

@H_403_5@/*<----------------------------insert------------------------------------------->*/

@H_403_5@sql="INSERTINTO/"SensorData/"VALUES(NULL,1,'200605011206',18.9);";

@H_403_5@rc=sqlite3_exec(db,&zErrMsg);//执行不需要返回数据的查询

@H_403_5@if(rc!=sqlITE_OK)

@H_403_5@{

@H_403_5@printf("Failedexec!,err_code:%d,err_reason:%s/n",rc,zErrMsg);

@H_403_5@}

@H_403_5@//@H_403_5@ @H_403_5@printf("OK,__LINE__);

@H_403_5@sql="INSERTINTO/"SensorData/"VALUES(NULL,'200605011306',16.9);";

@H_403_5@sqlite3_exec(db,&zErrMsg);

@H_403_5@/*if(rc!=QLITE_OK){

@H_403_5@if(zERR!=NULL){

@H_403_5@fprintf(stderr,zErr);

@H_403_5@sqlite_free(zErr);

@H_403_5@}

@H_403_5@}*/

@H_403_5@//@H_403_5@ @H_403_5@printf("OK,__LINE__);

@H_403_5@/*<-----------------------------query--------------------------------------->*/

@H_403_5@intnrow=0;

@H_403_5@intncolumn=0;

@H_403_5@char**azResult;

@H_403_5@sql="SELECT*FROMSensorData;";

@H_403_5@//返回一个表格化的结果集

@H_403_5@sqlite3_get_table(db,&azResult,&nrow,&ncolumn,&zErrMsg);

@H_403_5@inti=0;

@H_403_5@printf("row:%d,column:%d/n",nrow,ncolumn);

@H_403_5@printf("thequeriedresultis:/n");

@H_403_5@for(i=0;i<(nrow+1)*ncolumn;i++)

@H_403_5@printf("azResult[%d]:%s/n",i,azResult[i]);

@H_403_5@/*<-----------------------------delete--------------------------------------->*/

@H_403_5@sql="DELETEFROMSensorDataWHEREID=1;";

@H_403_5@sqlite3_exec(db,&zErrMsg);

@H_403_5@#ifdef_DEBUG_

@H_403_5@printf("zErrMsg=%s/n",zErrMsg);

@H_403_5@#endif

@H_403_5@sql="SELECT*FROMSensorData;";

@H_403_5@sqlite3_get_table(db,&zErrMsg);

@H_403_5@printf("/n/n/n/nrow:%dcolumn=%d",ncolumn);

@H_403_5@printf("/nAfterdeleting,theresultofqueryingis:/n");

@H_403_5@for(i=0;i<(nrow+1)*ncolumn;i++)

@H_403_5@printf("azResult[%d]=%s/n",azResult[i]);

@H_403_5@sqlite3_free_table(azResult);

@H_403_5@#ifdef_DEBUG_

@H_403_5@printf("%s/n",zErrMsg);

@H_403_5@#endif

@H_403_5@/*<-----------------------------update--------------------------------------->*/

@H_403_5@sql="UPDATESensorDataSETID='1'WHEREID='2';";

@H_403_5@puts(sql);@H_403_5@

@H_403_5@sqlite3_exec(db,&zErrMsg);

@H_403_5@#ifdef_DEBUG_

@H_403_5@printf("/nzErrMsg=%s/n",ncolumn);

@H_403_5@printf("/nAfterupdate,zErrMsg);

@H_403_5@#endif

@H_403_5@sqlite3_close(db);

@H_403_5@return0;

@H_403_5@}

@H_403_5@

@H_403_5@

@H_403_5@八、@H_403_5@下面与大家共享一个自创函数(在Ubuntu-Woojoy运行通过)

@H_403_5@关于自创函数的概念。大可以查阅相关资料。时于时间的关系,我就不详述了,如需要帮助,可以在我博客上留言。

@H_403_5@#include<stdio.h>

@H_403_5@#include<stdlib.h>

@H_403_5@#include"sqlite3.h"

@H_403_5@#include<string.h>

@H_403_5@voidfunction(sqlite3_context*ctx,intnargs,sqlite3_value**values)

@H_403_5@{

@H_403_5@inti;

@H_403_5@constchar*msg;

@H_403_5@fprintf(stdout,"function():Calledwith%iarguments/n",nargs);

@H_403_5@for(i=0;i<nargs;i++)

@H_403_5@{

@H_403_5@fprintf(stdout,"arg%i:value=%-7stype=%i/n",

@H_403_5@sqlite3_value_text(values[i]),

@H_403_5@sqlite3_value_type(values[i]));

@H_403_5@}

@H_403_5@if(strcmp((constchar*)sqlite3_value_text(values[0]),"fail")==0)

@H_403_5@{

@H_403_5@msg="function():Failingbecauseyoutoldmeto.";

@H_403_5@sqlite3_result_error(ctx,msg,strlen(msg));

@H_403_5@fprintf(stdout,"/n");

@H_403_5@return;

@H_403_5@}

@H_403_5@fprintf(stdout,"/n");

@H_403_5@sqlite3_result_int(ctx,0);

@H_403_5@}

@H_403_5@intexecute(sqlite3*db,...)

@H_403_5@{

@H_403_5@char*err,*tmp;

@H_403_5@va_listap;

@H_403_5@va_start(ap,sql);

@H_403_5@//sql=sqlite3_mprintf("INSERTINTO/"TelephoneData/"VALUES(NULL,'%s','%s');",c_str1,c_str2,c_str3,c_str4,c_str5,c_str6);

@H_403_5@tmp=sqlite3_vmprintf(sql,ap);

@H_403_5@va_end(ap);

@H_403_5@intrc=sqlite3_exec(db,tmp,&err);

@H_403_5@if(rc!=sqlITE_OK)

@H_403_5@{

@H_403_5@if(err!=NULL)

@H_403_5@{

@H_403_5@fprintf(stdout,"execute():Error%i:%s/n",err);

@H_403_5@sqlite3_free(err);

@H_403_5@}

@H_403_5@}

@H_403_5@sqlite3_free(tmp);

@H_403_5@returnrc;

@H_403_5@}

@H_403_5@intmain(intargc,char**argv)

@H_403_5@{

@H_403_5@intrc;

@H_403_5@sqlite3*db;

@H_403_5@constchar*sql;

@H_403_5@sqlite3_open("test.db",&db);

@H_403_5@sqlite3_create_function(db,"function",-1,sqlITE_UTF8,function,NULL);

@H_403_5@//dbconnectiondata,-1ismaybehaveservelvarIoUs

@H_403_5@//0isnohaveavarIoUs

@H_403_5@/*Turnonsqllogging*/

@H_403_5@//log_sql(db,1);

@H_403_5@/*Callfunctionwithonetextargument.*/

@H_403_5@execute(db,"selectfunction(1)");

@H_403_5@/*CallfunctionwithseveralargumentsofvarIoUstypes.*/

@H_403_5@execute(db,"selectfunction(1,2.71828)");

@H_403_5@/*Callfunctionwithvariableargument'svalue

@H_403_5@**being'fail'.Thiswilltriggerthefunctiontocall

@H_403_5@**sqlite3_result_error().*/

@H_403_5@execute(db,"selectfunction('fail',2.717828,'three',X'0004',NULL)");

@H_403_5@/*Done*/

@H_403_5@sqlite3_close(db);

@H_403_5@return0;

@H_403_5@}

@H_403_5@

@H_403_5@九、@H_403_5@结束语

@H_403_5@首先非常感激您能阅完本文章。本篇由本人个人创作,当然欢迎您进行批评指正。

@H_403_5@你也可以进行转载,但需标明出处,谢谢合作!!

猜你在找的Sqlite相关文章