SQLite相关知识总结

SQLite相关知识总结,第1张

概述sqlite3支持的数据类型: NULL、INTEGER、REAL、TEXT、BLOB 但是,sqlite3也支持如下的数据类型 smallint           16位整数 integer             32位整数 decimal(p,s)   p是精确值,s是小数位数 float                  32位实数 double             64位实数 ch

sqlite3支持的数据类型:

NulL、INTEGER、REAL、TEXT、BLOB
但是,sqlite3也支持如下的数据类型
smallint 16位整数
integer 32位整数
decimal(p,s) p是精确值,s是小数位数
float 32位实数
double 64位实数
char(n)n长度字符串,不能超过254
varchar(n) 长度不固定最大字符串长度为n,n不超过4000
graphic(n) 和 char(n) 一样,但是单位是两个字符double-bytes,n不超过127(中文字)
vargraphic(n) 可变长度且最大长度为n

date 包含了年份、月份、日期
time 包含了小时、分钟、秒
timestamp 包含了年、月、日、时、分、秒、千分之一秒

sqlite3支持的函数

【1】日期函数

datetime(): 产生日期和时间
date(): 产生日期
time():产生时间
strftime():对以上3个函数产生的日期和时间进行格式化

用法实例:
1、SELECT date('2011-9-9','+1 day','+1 year'); 结果是 2010-09-10
2、SELECT datetime('Now'); 当前日期和时间
3、SELECT datetime('Now','start of month'); 本月的第一天零点,也可以设置年和日的第一天
4、SELECT datetime('Now','+1 hour','-12 minute'); 当前时间加48分钟

strftime()函数可以将YYYY-MM-DD HH:MM:SS格式的日期字符串转换为其它形式的字符串

%d:天数,01-31
%f :小数形式的秒,SS.SSS
%H:小时
%j :某一天是该年的第几天,001-366
%m:月份,00-12
%M:分钟,00-59
%s:从1970到现在的秒数
%s:秒,00-59
%w:星期,0-6,0是星期天
%W:某天是该年的第几周,01-53
%Y:年,YYYY
%% 百分号

应用举例:
SELECT strftime('%Y.%m.%d %H:%M:%s','Now','localtime');


二、【算术函数】

abs(X):返回绝对值
max(X,Y[,...]):返回最大值
min(X,Y,[,...]):返回最小值
random(*):返回随机数
round(X[,Y]): 四舍五入

三、【字符串处理函数】

length(x) :返回字符串字符个数
lower(x) :大写转小写
upper(x):小写转大写
substr(x,y,Z):截取子串
like(A,B):确定给定的字符串与指定的模式是否匹配

四、【条件判断函数、集合函数、其它函数】

typeof(x):返回数据的类型
last_insert_rowID():返回最后插入的数据的ID

********************************************************************************************************************

sqlite3提供了C函数接口来 *** 作sqlite3数据库,其中有个关键数据结构 sqlite3 * 类型

1、打开数据库
int sqlite3_open(文件名,sqlite3 **); - 文件名若不存在,则会自动创建
返回sqlITE_OK表示 *** 作正常,这些宏的定义在sqlite3.h文件中定义,看源代码会懂的更多

2、关闭数据库
int sqlite3_close(sqlite3 *);

3、SQL语句 *** 作
int sqlite3_exec(sqlite3 *,const char *sql,sqlite3_callback,voID *,char **errmsg);
这就是执行一条SQL语句的函数
参数1:open函数得到的指针
参数2:一条SQL语句,以'\0'结尾
参数3:sqlite3_callback是回调,当这条语句执行后,sqlite3会调用你提供的这个函数,回调函数要查阅资料
参数4:voID *是自己提供的指针,可以传递任何指针到这里,这个参数最终会传到回调函数里面,如果不需要
传到回调函数里面,则可以设置为NulL
参数5:错误信息,当执行失败时,可以查阅这个指针,可以利用printf("%s\n",errmsg)得到一串字符串信息,
该信息表明出错的地方

通常,sqlite3_callback和voID *都设置为NulL,表示不需要回调,比如做insert、delete *** 作,就没有必要使用回调,而当使用select时,就要使用回调,因为sqlite3把数据查出来,得通过回调来说明查出什么数据


回调函数的定义格式:
typedef int (*sqlite3_callback)(voID *,int,char **,char **);

实例如下:

[cpp] view plain copy //sqlite每查到一条记录,就调用一次这个回调 intLoadMyInfo(voID*para,intn_column,87); background-color:inherit; Font-weight:bold">char**column_value,87); background-color:inherit; Font-weight:bold">char**column_name) { /*para:在sqlite3里传入的voID*参数,通过该参数可以传入一些特殊指针 *如类指针、结构指针,然后在这里转换成对应的类型(这里是voID*类型), *必须强制转换成自己的类型才可用,然后 *** 作这些数据*/ //n_column:该记录有多少个字段(列) /*char**column_value保存着查出来的数据,实际上是个1维数组,每一个元素都是 *char*值,是一个字段内容(用字符串表示,以\0结尾)*/ //char**column_name与column_value是对应的,表示这个字段的字段名称 //这里不是用para参数 printf("%=记录包含%d\n个字段",n_column); for(i=0;i<n_column;i++) { printf("字段名:%s,字段值:%s\n",column_name[i],column_value[i]); } printf("\n"); return0; } intmain(int,87); background-color:inherit; Font-weight:bold">char**) sqlite3*db; intresult; char*errmsg=NulL; charsql[512]; result=sqlite3_open("My.db",&db); if(result!=sqlITE_OK) //数据库打开失败 return-1; //创建数据表 strcpy(sql,"CREATEtabletest(IDINTEGERPRIMARYKEY,nameVARCHAR(32));"); result=sqlite3_exec(db,sql,NulL,errmsg); if(result!=sqlITE_OK) printf("创建表失败,错误:%s\n",errmsg); //插入记录 "INSERTINTOtestVALUES(1,'OK');"); printf("插入记录失败,错误:%s\n",0); background-color:inherit">//查询数据库 "SELECT*FROMtest;"); sqlite3_close(db); return0; }


以上是通过回调查询数据库,如果该函数在C++中,就要将其声明成static类型,因为C++
成员函数隐藏了一个参数:this,C++调用类的成员函数的时候,隐含把类指针当函数的第
一个参数传递进去,就与上面的sqlite回调函数参数不符

除了使用回调来查询,还可以使用非回调的查询,通过sqlite3_get_table函数做到
int sqlite3_get_table(sqlite3*,char ***resultp,int *nrow,int *ncolumn,char **errmsg);
参数3:resultp 是一维数组,第一行是字段名称,跟着是每个字段的值
参数4:查询共多少条记录
参数5:查询共多少个字段

*** 作实例如下:

copy char**dbResult; intnRow,nColumn; inti,j; intindex; return-1; result=sqlite3_get_table(db,&dbResult,&nRow,&nColumn,&errmsg); //查询成功 if(sqlITE_OK==result) //dbResult第一行是字段名称,从nColumn索引开始时真正的数据 index=nColumn; printf("查询到%d记录\n",nRow); for(i=0;i<nRow;i++) for(j=0;j<nColumn;j++) printf("字段名称:%s,dbResult[j],dbResult[index]); index++; printf("\n"); //释放char**查询结果 sqlite3_free_table(dbResult); sqlite3_close(db); }


上述使用的方法适用于大多数数据库需求,但是不能适用于二进制数据, *** 作二进制数据方法需要用到一个数据类型sqlite3_stmt *,该数据类型记录了一个"SQL语句",这里的SQL语句是解析后的,用sqlite自己标记记录的内部数据结构,并不是我们熟悉的SQL语句

数据插入到 sqlite3_stmt结构里可不能直接memcpy,也不能像std::string那样用+号,必须用sqlite提供的
函数来插入。

假设有创建一张表如下
CREATE table test2(ID INTEGER,file_content BLOB)

首先声明 sqlite3_stmt *stat; 然后将一个SQL语句解析到stat结构里去
sqlite3_prepare(db,"INSERT INTO test2(ID,file_content) VALUES(10,?)",-1,&stat,0);
这里SQL语句中有个?号,在该函数里,?表示一个未定的值
参数3:表示前面SQL语句的长度,如果小于0,sqlite会自动计算它的长度
参数4:sqlite3_stat指针的指针,解析后的SQL语句就放在该结构里
参数5:一般设为0

返回值为sqlITE_OK且stat不为NulL,表示成功,当prepare成功后,开始查询数据
int result = sqlite3_step(stat);
该值返回sqlITE_ROW 表示成功

可以循环执行sqlite3_step函数,一次step查询出一条记录,直到返回值不为sqlITE_ROW
然后开始获取第一个字段:ID值,ID是个整数,使用如下 *** 作
int ID = sqlite3_column_int(stat,0); //0表示第1字段
下面获取file_content的值,因为file_content是二进制,因此需要得到它的指针,还有长度
const voID * pfileContent = sqlite3_column_blob(stat,1);
int len = sqlite3_column_bytes(stat,1);
把 pfileContent内容保存后,要释放sqlite3_stmt结构
sqlite3_finalize(stat);

如果需要重复使用 sqlite3_prepare解析好的sqlite3_stmt结构,使用 sqlite3_reset函数
result = sqlite3_reset(stat);
这样,stat结构又成为sqlite3_prepare完成时的状态

sqlite 数据库事务处理

如果需要同步删除很多数据,可以将它们做成一个统一的事务,通常sqlite3_exec就是一次事务,假设要删除1W条记录,sqlite就做了1W次,开始事务->删除数据->提交事务,这个 *** 作很慢,我们可以将同类 *** 作作成一个事物,如果 *** 作错误,还可以回滚事务

事务的 *** 作没有特别的接口函数,只是普通的SQL语句
int result;
result = sqlite3_exec(db,"begin transtraction",&zErrorMsg);
result = sqlite3_exec(db,"commit transtraction","rollback transtraction",&zErrorMsg);

sqlite3 错误编码如下:

copy #definesqlITE_OK0/*Successfulresult*/ #definesqlITE_ERROR1/*sqlerrorormissingdatabase*/ #definesqlITE_INTERNAL2/*Aninternallogicerrorinsqlite*/ #definesqlITE_PERM3/*AccesspermissiondenIEd*/ #definesqlITE_ABORT4/*Callbackroutinerequestedanabort*/ #definesqlITE_BUSY5/*Thedatabasefileislocked*/ #definesqlITE_LOCKED6/*Atableinthedatabaseislocked*/ #definesqlITE_NOMEM7/*Amalloc()Failed*/ #definesqlITE_Readonly8/*AttempttowriteaReadonlydatabase*/ #definesqlITE_INTERRUPT9/*Operationterminatedbysqlite_interrupt()*/ #definesqlITE_IOERR10/*SomekindofdiskI/Oerroroccurred*/ #definesqlITE_CORRUPT11/*Thedatabasediskimageismalformed*/ #definesqlITE_NOTFOUND12/*(InternalOnly)tableorrecordnotfound*/ #definesqlITE_FulL13/*InsertionFailedbecausedatabaseisfull*/ #definesqlITE_CANtopEN14/*Unabletoopenthedatabasefile*/ #definesqlITE_PROTOCol15/*Databaselockprotocolerror*/ #definesqlITE_EMPTY16/*(InternalOnly)Databasetableisempty*/ #definesqlITE_SCHEMA17/*Thedatabaseschemachanged*/ #definesqlITE_TOOBIG18/*Toomuchdataforonerowofatable*/ #definesqlITE_CONSTRAINT19/*Abortduetocontraintviolation*/ #definesqlITE_MISMATCH20/*Datatypemismatch*/ #definesqlITE_MISUSE21/*libraryusedincorrectly*/ #definesqlITE_NolFS22/*UsesOSfeaturesnotsupportedonhost*/ #definesqlITE_AUTH23/*AuthorizationdenIEd*/ #definesqlITE_ROW100/*sqlite_step()hasanotherrowready*/ #definesqlITE_DONE101/*sqlite_step()hasfinishedexecuting*/ 总结

以上是内存溢出为你收集整理的SQLite相关知识总结全部内容,希望文章能够帮你解决SQLite相关知识总结所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1172287.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存