[原创]使用FMDB的访问数据库

  最近开始写博客了,把我学习到的东西进行汇总和总结。

  今天复习到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* sql=@"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

posted @ 2015-07-13 10:47  砺劍  阅读(239)  评论(0编辑  收藏  举报