最近开始写博客了,把我学习到的东西进行汇总和总结。
今天复习到FMDB,FMDB是一个第三方的访问数据库的插件。有了它以后,妈妈再也不用担心我访问数据库的问题。
好了,言归正传,为什么要使用FMDB呢?
最直接的一个原因就是,iOS中的sqlite3访问数据库的代码太过繁琐,难记,写起来也不顺手,究其原因非常简单,就是sqlite3是C封装的一个访问数据库的api,它是用C写的,你想用也要用C的形式去访问,所以,使用起来你会觉得有点变扭,就好像是一个生活在广东的外地人,虽然也可以和广东人交流,但是还是感觉到一丝的变扭。
而FMDB就解决了这个变扭的问题,它是用OC的语法再次封装了sqlite3,你去使用FMDB全程都是OC语法,并且缩减优化了很多的内容,让我们操纵数据库变得更加的快速方便。
FMDB下载地址:https://github.com/ccgus/fmdb (友情链接,如果无法使用,自己百度把,哈哈)
当你下载完了FMDB之后,需要做的事情有以下几步:
1.将FMDB的文件夹拖入工程中
2.在工程的Library中添加libsqlite3.dylib包
3.在需要使用FMDB的地方,导入FMDB,在这里我添加了一个FMDB.h文件,在FMDB.h文件中导入了FMDB所有的包,所以要使用所有的包,直接导入FMDB.h文件就好了,例:#import "FMDB.h"
FMDB.h文件包括所有FMDB文件的列表如下图所示:
FMDB中常用的内容如下:
1.FMDatabase:一个数据库的引用,代表了一个数据库,可以用于执行SQL语句
2.FMResultSet:一个结果集,该结果集存放了数据库查询语句的结果。
好了,让我们来做第一件事情,创建数据库
//创建一个路径字符串,该路径是沙盒中的Documents目录下的student.sqlite
NSString* path=[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingString:@"student.sqlite"];
//根据路径去打开数据库文件,如果文件不存在则创建数据库文件
FMDatabase* db=[FMDatabase databaseWithPath:path];
第二件事情,打开数据库连接 ,关闭数据库连接
//open方法可以打开数据库连接,并且返回一个BOOL值表示打开数据库连接是否成功
BOOL result=[db open];
.......;//数据库操作
//关闭数据库连接,做完操作就关闭是个好习惯,及时释放连接减少内存使用。
[db close];
第三件事情,使用FMDB执行增删查改,创表等操作
如果要做查询的话需要使用executeQuery方法。
除了查询以外的其他sql语句都使用executeUpdate方法去执行。
例如,创建数据表:
//使用executeUpdate执行创表语句并返回一个BOOL值表示创表的执行结果,YES则创表成功,NO则创表失败
if([db open]){//记得要打开数据库连接才能使用executeUpdate执行sql语句
BOOL cResult=[self.myDB executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student(sid integer PRIMARY KEY AUTOINCREMENT,name text NOT NULL,sex text NOT NILL,age int);"];
}
[db close]; //用完了厕所记得冲,嘎嘎
执行了上面的代码之后,我们的数据库中就多了一个t_student数据表,表中没有任何数据,我们可以使用executeUpdate方法来增删改数据,如果使用executeUpdate时传递的是一个完整的sql语句,不能传参,我现在使用的executeUpdateWithFormat是可以传递参数的执行方式。但是要注意的是使用这种方式不再需要提供数据库字符串的‘‘(单引号),因为FMDB已经封装好了,你如果用了反而会出问题。
添加数据:
if([db open]){
for (int i=1;i<100;i++){
NSString* name=[NSString stringWithFormat:@"学生-%d",i];
//使用fmdb提供的WithFormat时不需要为字符串类型提供‘’(单引号)
[self.myDB executeUpdateWithFormat:@"insert into t_student values(%@,%@,%d)",name,i%2?@"男":@"女",i];
}}
[db close];
删除数据:
if([db open]){
//删除编号为1的数据,
//尤其要注意的是删除语句必须是delete from,插入语句必须是insert into,因为我之前都是使用SQL SERVER的,在这两个东西上面都吃过亏
[db executeUpdate:@"delete from t_student where sid=1"];
}
[db close];
更新数据:
if([db open]){
//更新性别信息,男变女
[db executeUpdateWithFormat:@"update t_student set sex=%@ where sex=%@",@"男",@"女"];
}
[db close];
最后是比较麻烦的查询数据,它不像之前的增删改,只要执行了就会有成功或者失败的结果就好了,查询它返回的是表的数据结果集,所以我们会使用FMResultSet来存放最后的查询结果。
查询数据:
if([db open]){
NSString* [email protected]"select * from t_student";
//使用executeQuery方法执行sql语句并返回一个FMResultSet*对象,该对象包含查询语句的结果
FMResultSet* rs=[db executeQuery:sql];
while([rs next])//使用结果集对象的next方法可以读取结果集中的下一行数据,如果next方法结果为NO,则代表数据读取完毕
{//这种语法形式比较像JAVA了,感觉比sqlite3的亲民的多
//结果集的XXXForColumn:COLUMN方法,XXX代表的是返回的类型,COLUMN代表的是数据表列名
int sid=[rs intForColumn:sid];//sid是t_student的sid列的意思,intForColumn表示以整型形式返回
NSString* name=[rs stringForColumn:name];
NSString* sex = [rs stringForColumn:sex];
int age=[rs intForColumn:age];
//我这里并没有封装实体,所以直接打印了,是否要封装实体,看各位大大的需要了
NSLog(@"编号:%d,姓名:%@,性别:%@,年龄:%d",sid,name,sex,age);
}
}
[db close];
再附送XXXForColumn的具体形式,你能读取些什么样的类型呢,且看下图:
FMDB真的不错,使用起来也是真的很方便,想起来sqlite3就是两行泪啊。
最后,附送FMDB中封装的事务执行语法:
if([db open]){
[db beginTransaction];//开始事务
@try{
.......;//执行相关的数据操作;
}
@catch(NSException* ex){
[db rollback];//回滚操作;
}
[db commit];//提交事务
}
[db close];//关闭数据库连接
好了,今天的分享就道这里,希望能对大家有所帮助,如果有什么问题,欢迎大家来讨论与学习,qq:1750587828