Tag Archives: SQLite

SQLite BLOB的使用、出现乱码问题并解决

 (*)本文系本博客原创,如需转载请注明原作者!

原文作者:戴晓天,云飞实验室

联系方式:automatic.dai@gmail.com

原文来自:www.yfworld.com

SQLite是轻量级数据库,但其功能齐全,当然也包括了对BLOB对象的操作功能。但今天在做SQLite的BLOB功能测试时,出现了读取出的数据与写入数据不一致的情况,这让我十分费解。

测试程序将一幅图片文件读入内存,写入数据库。之后从数据库中读出,再写出成图片文件。整个程序的执行过程示意如下:

1. 打开数据库

sqlite3_open("blob.db",&db);

 

2. 新建一个表,包含两个字段:name和item,其中name为varchar(128)是文件名,item为blob类型

sprintf( sql,"CREATE TABLE blob(id varchar(128) UNIQUE,item BLOB)" );
sqlite3_exec(db, sql, 0, 0, &zErrMsg);     // zErrMsg是错误代码

 

3. 准备一次blob传输,其中 ? 为占位符,之后要将其绑定

(*)stat为sqlite_stmt * 类型

sqlite3_prepare(db, "INSERT INTO blob values (1,?);", -1, &stat, 0);

 

4. 打开一个对象,以便将其绑定

(*)数据保存在pFile中,数据大小保存在filesize中,在下一步会用到。

fp = fopen("test.bmp", "rb");

//首先计算文件大小
fseek(fp, 0, SEEK_END);
filesize = ftell(fp);

fseek(fp, 0, SEEK_SET);

//将数据读入到缓冲区
pFile = new char[filesize];
size_t sz = fread(pFile, sizeof(char), filesize, fp);
fclose(fp);

 

5. 绑定数据并执行

sqlite3_bind_blob(stat, 1, pFile, filesize, NULL);
sqlite3_step(stat);
sqlite3_finalize(stat);  // Release sqlite_stmt

----------------------------------------------------------------

以上完成了blob数据的写入,现在将其读出。

6. 进行一次读出操作

sqlite3_prepare(db, "select * from blob;", -1, &stat, 0);
sqlite3_step(stat);

 

7. 得到Blob文件的指针和大小

const void *pBlob = sqlite3_column_blob(stat, 1); // Get blob,1为列号
int blob_size = sqlite3_column_bytes(stat, 1);    // Get size

 

8. 将其写入文件

fp = fopen("test_output.bmp", "w+");

size_t sz = fwrite(pBlob, sizeof(char), blob_size, fp);

 

至此,一个Blob对象的写入/读出操作就完成了。

----------------------------------------------------------------

Read more »