
在实际的编程开发当中我们经常要处理一些大容量二进制数据的存储,如图片或者音乐等等。对于这些二进制数据(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()
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)