Sqlite简单介绍与一些常用的例子

前端之家收集整理的这篇文章主要介绍了Sqlite简单介绍与一些常用的例子前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Sqlite简单介绍与一些常用的例子
@H_404_3@

转:http://www.jb51.cc/article/p-sgjplmbc-kx.html
@H_404_3@

1:常用接口@H_404_3@

个人比较喜欢@H_404_3@sqlite,@H_404_3@使用最方便,唯一的准备工作是下载@H_404_3@250K@H_404_3@的源;而且作者很热心,有问必答。@H_404_3@@H_404_3@

以下演示一下使用@H_404_3@sqlite@H_404_3@的步骤,先创建一个数据库,然后查询其中的内容。@H_404_3@2@H_404_3@个重要结构体和@H_404_3@5@H_404_3@个主要函数:@H_404_3@@H_404_3@

sqlite3 *pdb,@H_404_3@数据库句柄,跟文件句柄@H_404_3@FILE@H_404_3@很类似@H_404_3@@H_404_3@

sqlite3_stmt *stmt,@H_404_3@这个相当于@H_404_3@ODBC@H_404_3@的@H_404_3@Command@H_404_3@对象,用于保存编译好的@H_404_3@sql@H_404_3@语句@H_404_3@@H_404_3@

@H_404_3@

sqlite3_open(),@H_404_3@打开数据库@H_404_3@@H_404_3@

sqlite3_exec(),@H_404_3@执行非查询的@H_404_3@sql@H_404_3@语句@H_404_3@@H_404_3@

sqlite3_prepare(),@H_404_3@准备@H_404_3@sql@H_404_3@语句,执行@H_404_3@select@H_404_3@语句或者要使用@H_404_3@parameter bind@H_404_3@时,用这个函数(封装了@H_404_3@sqlite3_exec@H_404_3@)@H_404_3@.@H_404_3@

sqlite3_step(),@H_404_3@调用@H_404_3@sqlite3_prepare@H_404_3@后,使用这个函数在记录集中移动。@H_404_3@@H_404_3@

sqlite3_close(),@H_404_3@关闭数据库文件@H_404_3@@H_404_3@

还有一系列的函数,用于从记录集字段中获取数据,如@H_404_3@@H_404_3@

sqlite3_column_text(),@H_404_3@取@H_404_3@text@H_404_3@类型的数据。@H_404_3@@H_404_3@

sqlite3_column_blob@H_404_3@(),取@H_404_3@blob@H_404_3@类型的数据@H_404_3@@H_404_3@

sqlite3_column_int(),@H_404_3@取@H_404_3@int@H_404_3@类型的数据@H_404_3@@H_404_3@

…@H_404_3@

2:sqlite数据类型介绍@H_404_3@

@H_404_3@

在进行数据库@H_404_3@sql@H_404_3@@H_404_3@操作之前,首先有个问题需要说明,就是@H_404_3@sqlite@H_404_3@@H_404_3@的数据类型,和其他的数据库不同,@H_404_3@sqlite@H_404_3@@H_404_3@支持的数据类型有他自己的特色,这个特色有时会被认为是一个潜在的缺点,但是这个问题并不在我们的讨论范围之内。@H_404_3@
@H_404_3@大多数的数据库在数据类型上都有严格的限制,在建立表的时候,每一列都必须制定一个数据类型,只有符合该数据类型的数据可以被保存在这一列当中。而在@H_404_3@sqlite 2.X@H_404_3@@H_404_3@中,数据类型这个属性只属于数据本生,而不和数据被存在哪一列有关,也就是说数据的类型并不受数据列限制(有一个例外:@H_404_3@INTEGER PRIMARY KEY,该列只能存整型数据@H_404_3@)。@H_404_3@
@H_404_3@但是当@H_404_3@sqlite@H_404_3@@H_404_3@进入到@H_404_3@3.0@H_404_3@@H_404_3@版本的时候,这个问题似乎又有了新的答案,@H_404_3@sqlite@H_404_3@@H_404_3@的开发者开始限制这种无类型的使用,在@H_404_3@3.0@H_404_3@@H_404_3@版本当中,每一列开始拥有自己的类型,并且在数据存入该列的时候,数据库会试图把数据的类型向该类型转换,然后以转换之后的类型存储。当然,如果转换被认为是不可行的,@H_404_3@sqlite@H_404_3@@H_404_3@仍然会存储这个数据,就像他的前任版本一样。@H_404_3@
@H_404_3@举个例子,如果你企图向一个@H_404_3@INTEGER@H_404_3@@H_404_3@类型的列中插入一个字符串,@H_404_3@sqlite@H_404_3@@H_404_3@会检查这个字符串是否有@H_404_3@整型@H_404_3@数据的特征@H_404_3@,@H_404_3@@H_404_3@如果有而且可以被数据库所识别,那么该字符串会被转换成@H_404_3@整型@H_404_3@再保存,如果不行,则还是作为@H_404_3@整型@H_404_3@存储。@H_404_3@

@H_404_3@总的来说,所有存在@H_404_3@sqlite 3.0@H_404_3@@H_404_3@版本当中的@H_404_3@数据@H_404_3@都拥有以下之一的数据类型:@H_404_3@
@H_404_3@空(@H_404_3@NULL@H_404_3@@H_404_3@)@H_404_3@:该值为空@H_404_3@
@H_404_3@整型(@H_404_3@INTEGEER@H_404_3@@H_404_3@)@H_404_3@:有符号整数,按大小被存储成@H_404_3@1,2,3,4,6@H_404_3@@H_404_3@或@H_404_3@8@H_404_3@@H_404_3@字节。@H_404_3@
@H_404_3@实数(@H_404_3@REAL@H_404_3@@H_404_3@)@H_404_3@:浮点数,以@H_404_3@8@H_404_3@@H_404_3@字节指数形式存储。@H_404_3@
@H_404_3@文本(@H_404_3@TEXT@H_404_3@@H_404_3@)@H_404_3@:字符串,以数据库编码方式存储(@H_404_3@UTF-8,UTF-16BE@H_404_3@@H_404_3@或者@H_404_3@UTF-16-LE@H_404_3@@H_404_3@)。@H_404_3@
@H_404_3@BLOB@H_404_3@@H_404_3@:@H_404_3@BLOB@H_404_3@@H_404_3@数据不做任何转换,以输入形式存储。@H_404_3@

ps:@H_404_3@@H_404_3@在关系数据库中,@H_404_3@CLOB@H_404_3@@H_404_3@和@H_404_3@BLOB@H_404_3@@H_404_3@类型被用来存放大对象。@H_404_3@BOLB@H_404_3@@H_404_3@表示二进制大对象,这种数据类型通过用来保存图片,图象,视频等。@H_404_3@CLOB@H_404_3@@H_404_3@表示字符大对象,能够存放大量基于字符的数据。@H_404_3@

@H_404_3@对应的,对于数据列,同样有以下的数据类型:@H_404_3@

  • TEXT@H_404_3@
  • NUMERIC@H_404_3@
  • INTEGER@H_404_3@
  • REAL@H_404_3@
  • NONE@H_404_3@

数据列的属性的作用是确定对插入的数据的转换方向:@H_404_3@

  • TEXT@H_404_3@将数据向文本进行转换,对应的数据类型为NULL@H_404_3@,TEXT@H_404_3@或BLOB@H_404_3@
  • NUMERIC@H_404_3@将数据向数字进行转换,对应的数据类型可能为所有的五类数据,当试图存入文本@H_404_3@时将执行向整型或浮点类型的转换(视具体的数值而定),转换若不可行,则保留文本类型存储,NULL@H_404_3@或BLOB@H_404_3@不做变化
  • INTEGER@H_404_3@将数据向整型转换,类似于NUMERIC@H_404_3@,不同的是没有浮点标志的浮点数将转换为整型保存
  • REAL@H_404_3@将数据向浮点数类型转换,类似于NUMERIC@H_404_3@,不同的是整数将转换为浮点数保存
  • NULL@H_404_3@不做任何转换的数据列类型

实例代码如下@H_404_3@,@H_404_3@

附件工程可直接编译,例子使用了@H_404_3@blob@H_404_3@数据类型。@H_404_3@@H_404_3@

#include "sqlite3.h" //@H_404_3@包含一个头文件就可以使用所以@H_404_3@sqlite@H_404_3@的接口了@H_404_3@@H_404_3@

#include "stdlib.h"@H_404_3@

#include "stdio.h"@H_404_3@

#include "string.h"@H_404_3@

#pragma comment(lib,"sqlite.lib") //@H_404_3@我把@H_404_3@sqlite@H_404_3@编译成了一个静态的@H_404_3@lib@H_404_3@文件。@H_404_3@@H_404_3@

void createdb();@H_404_3@

void querydb();@H_404_3@

int main()@H_404_3@

{@H_404_3@

createdb();@H_404_3@

querydb();@H_404_3@

return 0;@H_404_3@

}@H_404_3@

void createdb()@H_404_3@

int ret;@H_404_3@

sqlite3 *pdb = 0;@H_404_3@

sqlite3_stmt *stmt = 0;@H_404_3@

char *error = 0;@H_404_3@

char *sql = "insert into table1 values('value11',:aaa)";@H_404_3@

int index;@H_404_3@

static void *value = "asdfadsfasdfjasdfjaksdfaskjdfakdsfaksfja";@H_404_3@

ret = sqlite3_open("db1.sdb",&pdb); //@H_404_3@打开数据库,跟打开文本文件一样@H_404_3@@H_404_3@

if( ret != sqlITE_OK )@H_404_3@

return;@H_404_3@

ret = sqlite3_exec(pdb,"create table table1(col1 char(20),col2 BLOB)",&error );@H_404_3@

ret = sqlite3_prepare(pdb,sql,strlen(sql),&stmt,&error);@H_404_3@

index = sqlite3_bind_parameter_index(stmt,":aaa");@H_404_3@

ret = sqlite3_bind_blob(stmt,index,value,strlen(value),sqlITE_STATIC);@H_404_3@

ret = sqlite3_step(stmt);@H_404_3@

if( ret != sqlITE_DONE )@H_404_3@

sqlite3_close(pdb);@H_404_3@

void querydb()@H_404_3@

sqlite3 *pdb = 0;@H_404_3@

sqlite3_stmt *pstmt = 0;@H_404_3@

char *error = 0;@H_404_3@

char *sql = "select * from table1";@H_404_3@

int len;@H_404_3@

int i;@H_404_3@

char *name;@H_404_3@

void *value;@H_404_3@

404_3@

while( 1 )@H_404_3@

{@H_404_3@

ret = sqlite3_step(pstmt);@H_404_3@

if( ret != sqlITE_ROW )@H_404_3@

break;@H_404_3@

name = sqlite3_column_text(pstmt,0);@H_404_3@

value = sqlite3_column_blob(pstmt,1);@H_404_3@

len = sqlite3_column_bytes(pstmt,1 );@H_404_3@

}@H_404_3@

实例二:sqlite@H_404_3@中如何用@H_404_3@api@H_404_3@操作@H_404_3@blob@H_404_3@类型的字段@H_404_3@@H_404_3@

@H_404_3@

@H_404_3@@H_404_3@

在实际的编程开发当中我们经常要处理一些大容量二进制数据的存储,如图片或者音乐等等。对于这些二进制数据(blob字段)我们不能像处理普通的文本那样简单的插入或者查询,为此sqlite提供了一组函数来处理这种BLOB字段类型。下面的代码演示了如何使用这些API函数

首先我们要建立一个数据库

sqlite3_exec(db,"CREATE TABLE list (fliename varchar(128) UNIQUE,fzip blob);",&zErrMsg);

//由于mmmm.rar是一个二进制文件,所以要在使用insert语句时先用?号代替

sqlite3_prepare(db,"insert into list values ('mmmm.rar',?@H_404_3@);",-1,&stat,0);

FILE *fp;

long@H_404_3@filesize = 0;

char@H_404_3@* ffile;

fp = fopen("mmmm.rar","rb");

if@H_404_3@(fp != NULL)

{

//计算文件的大小

fseek(fp,SEEK_END);

filesize = ftell(fp);

fseek(fp,SEEK_SET);

//读取文件

ffile =new@H_404_3@char@H_404_3@[filesize+1];

size_t sz = fread(ffile,sizeof@H_404_3@(char@H_404_3@),filesize+1,fp);

fclose(fp);

}

//将文件数据绑定到insert语句中,替换“?”部分

sqlite3_bind_blob(stat,1,ffile,filesize,NULL);

//执行绑定之后的sql语句

sqlite3_step(stat);

这时数据库当中已经有了一条包含BLOB字段的数据。接下来我们要读取这条数据:

//选取该条数据

sqlite3_prepare(db,"select * from list;",0);

sqlite3_step(stat);

//得到纪录中的BLOB字段

const@H_404_3@void@H_404_3@* test = sqlite3_column_blob(stat,1);

//得到字段中数据的长度

int@H_404_3@size = sqlite3_column_bytes(stat,1);

//拷贝该字段

sprintf(buffer2,"%s",test);

此时可以将buffer2写入到文件当中,至此BLOB数据处理完毕。

实例三:sqlite 中用blob存储图片和取出图片@H_404_3@

#include<iostream>
#include<string>
#include<sqlite3.h>@H_404_3@

using namespace std;@H_404_3@

int main()
{
sqlite3 *db;
sqlite3_stmt *stat;
char *zErrMsg = 0;@H_404_3@

char buffer2[1024]="0";@H_404_3@

@H_404_3@


sqlite3_open("./MetaInfo.db",&db);
int result;

if(result)
{
cout<<"Open the database sqlite.db Failed"<<endl;
}

else
cout<<"Open the database sqlite.db sucessfully"<<endl;

sqlite3_exec(db,&zErrMsg);
sqlite3_prepare(db,"insert into list values ('./data/2.bmp',?);",0);

FILE *fp;
long filesize = 0;
char * ffile;

fp = fopen("./data/2.bmp","rb");

if(fp != NULL)
{
fseek(fp,SEEK_END);
filesize = ftell(fp);
fseek(fp,SEEK_SET);

ffile = new char[filesize+1];
size_t sz = fread(ffile,sizeof(char),fp);

fclose(fp);
}

sqlite3_bind_blob(stat,NULL);
sqlite3_step(stat);

sqlite3_prepare(db,0);
sqlite3_step(stat);

const void * test = sqlite3_column_blob(stat,1);
int size = sqlite3_column_bytes(stat,1);

sprintf(buffer2,test);

FILE*fp2;

fp2 = fopen("outfile.png","wb");

if(fp2 != NULL)
{
size_t ret = fwrite(test,size,fp2);
fclose(fp2);
}

delete(ffile); sqlite3_finalize(stat); sqlite3_close(db); return 0; }

猜你在找的Sqlite相关文章