请教SQLite数据库读写BLOB字段

请教SQLite数据库读写BLOB字段,第1张

SQLite中如何用api *** 作blob类型的字段

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

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

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

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

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

FILE *fp

long filesize = 0

char * ffile

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

if(fp != NULL)

{

//计算文件的大小

fseek(fp, 0, SEEK_END)

filesize = ftell(fp)

fseek(fp, 0, SEEK_SET)

//读取文件

ffile = new char[filesize+1]

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

fclose(fp)

}

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

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

sqlite是一个嵌入式的SQL数据库引擎,只用一个文件就ok,小巧方便,所以是一个非常不错的嵌入式数据库,在Mozilla Firefox使用SQLite作为数据库。

例如:存放cookies的文件就是一个SQLite的数据库文件,一般存在于 ~/.mozilla/firefox/cojs83dh.default目录下,那么如何进行查看呢?

可使用vim打开文件,查看到使用的格式是sqlite3,而在GNU Linux下有一个命令可以对其进行查看:sqlite3,以下就是具体的使用步骤:

0、使用命令对此数据库进行打开:

$ sqlite3 cookies.sqlite

进行入sqlite3命令行模式

1、查看此文件中的数据库的名称:

sqlite>.databases

seq name file

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

0main /home/ufo/.mozilla/firefox/cojs83dh.default/cookies.sqlite

2、再查看此文件中已经存在数据表:

sqlite>.tables

moz_cookies

可看到此文件中包含一个表,名为moz_cookies;

3、查看此表中的字段名称:

sqlite>.schema moz_cookies

CREATE TABLE moz_cookies (id INTEGER PRIMARY KEY, baseDomain TEXT, appId INTEGER DEFAULT 0, inBrowserElement INTEGER DEFAULT 0, name TEXT, value TEXT, host TEXT, path TEXT, expiry INTEGER, lastAccessed INTEGER, creationTime INTEGER, isSecure INTEGER, isHttpOnly INTEGER, CONSTRAINT moz_uniqueid UNIQUE (name, host, path, appId, inBrowserElement))

CREATE INDEX moz_basedomain ON moz_cookies (baseDomain, appId, inBrowserElement)

4、显示表内的数据条目:

sqlite>.mode line

以上这句表示输出表项的显示模式为每一个字段一行的模式进行显示;

以下语句将输出类似于以下内容的表项条目:

sqlite>select * from moz_cookies

id = 10

baseDomain = bing.com

appId = 0

inBrowserElement = 0

name = SRCHUID

value = V=2&GUID=AC1BDDF445C84528931CF2960245B9A9

host = cn.bing.com

path = /

expiry = 1466758101

lastAccessed = 1404991858781769

creationTime = 1403686100491716

isSecure = 0

isHttpOnly = 0

id = 11

baseDomain = bing.com

appId = 0

inBrowserElement = 0

name = SRCHUSR

value = AUTOREDIR=0&GEOVAR=&DOB=20140624

host = .bing.com

path = /

expiry = 1466758101

lastAccessed = 1404991858781769

creationTime = 1403686100493026

isSecure = 0

isHttpOnly = 0

1、使用insert方法插入记录

sqlitedatabase的insert方法的签名为long

insert(string

table,string

nullcolumnhack,contentvalues

values),这个插入方法的参数说明如下:

table:代表想插入数据的表名。

nullcolumnhack:代表强行插入null值的数据列的列名。

values:代表一行记录的数据。

insert方法插入的一行记录使用contentvalues存放,contentvalues类似于map,它提供了put(string

key,xxx

value)(其中key为数据列的列名)方法用于存入数据、getasxxx(string

key)方法用于取出数据。

例如如下语句:

contentvalues

values=new

contentvalues()

values.put("name","孙悟空"):

values.put("age",500)

//返回新添记录的行号,该行号是一个内部直,与主键id无关,发生错误返回-1

long

rowid=db.insert("person_inf",null,values)

2、使用update方法更新数据

sqlitedatabase的update方法签名为update(string

table,contentvalues

values,string

whereclause,string[]

whereargs),这个更新方法的参数说明如下:

table:代表想要更新数据的表名。

values:代表想要更新的数据。

whereclause:满足该whereclause子句的记录将会被更新。

whereargs:用于为whereargs子句传递参数。

例如我们想要更新person_inf表中所有主键大于20的人的人名,可调用如下方法:

contentvalues

values=new

contentvalues()

//存放更新后的人名

values.put("name","新人名")

int

result=db.update("person_inf",values,"_id>?",new

integer[]{20})

3、使用delete方法删除记录

sqlitedatabase的delete方法签名为delete(string

table,string

whereclause,string[]

whereargs),这个删除的参数说明如下:

table:代表想删除数据的表名。

whereclause:满足该whereclause子句的记录将会被删除。

whereargs:用于为whereargs子句传入参数。

删除person_inf表中所有人名以孙开头的记录

int

result=db.delete("person_inf","person_name

like

?",new

string[]{"孙_"})

4、使用query方法查询记录

sqlitedatabase的query方法签名为cursor

query(boolean

distinct,string

table,string[]

columns,string

selection,string[]

selectionargs,string

groupby,string

having,string

orderby,string

limit),这个query方法的参数说明如下。

distinct:指定是否去除重复记录。

table:执行查询数据的表名。

columns:要查询出来的列名。

selection:查询条件子句。

selectionargs:用于为selection子句中占位符传入参数值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。

groupby:用于控制分组。

having:用于对分组进行过滤。

orderby:用于对记录进行排序。

limit:用于进行分页。

例如查询出person_inf表中人名以孙开头的数据

cursor

cursor=db.query("person_inf",new

string[]{"_id,name,age"},"name

like

?",new

string

[]{"孙%"},null,null,"personid

desc","5,10")

cursor.close()


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

原文地址:https://54852.com/sjk/10037853.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存