[原创]使用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* [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

时间: 2024-10-14 14:19:52

[原创]使用FMDB的访问数据库的相关文章

使用FMDB多线程访问数据库,及database is locked的问题

今天终于解决了多线程同时访问数据库时,报数据库锁定的问题,错误信息是: Unknown error finalizing or resetting statement (5: database is locked) 最后通过FMDatabaseQueue解决了这个问题,本文总结一下: FMDatabase不能多线程使用同一个实例 多线程访问数据库,不能使用同一个FMDatabase的实例,否则会发生异常.如果线程使用单独的FMDatabase实例是允许的,但是同样有可能发生database is

IOS 使用FMDB多线程访问数据库 及databaseislocked的问题

原理:文件数据库sqlite,同一时刻允许多个进程/线程读,但同一时刻只允许一个线程写.在操行写操作时,数据库文件被琐定,此时任何其他读/写操作都被阻塞,如果阻塞超过5秒钟(默认是5秒,能过重新编译sqlite可以修改超时时间),就报"database is locked"错误. 所以,在操作sqlite时,应该即时关闭连接:打开连接后,尽量减少非常费时的操作. 多线程同时访问数据库时,报数据库锁定的问题,错误信息是: Unknown error finalizing or reset

[原创] Xcode中使用sqlite3访问数据库

最近开始写博客了,把我学习到的东西进行汇总和总结,今天就说说怎么使用sqlite3来操纵数据库吧 数据库的相关知识我就不去说明了,毕竟只要会sql语言的人就大家都一样. 本案例是在Xcode环境下创建的single view application进行演示操作,如有不清楚的朋友可以找我下载代码.qq:1750587828. 首先第一点,为什么要使用sqlite3? 在iOS的编程中,毫无疑问接触最多的就是界面的代码编排和设计,数据的解析与放置,算法的各种挠头问题... 在数据的解析与放置这一块,

javaweb三、JDBC访问数据库

JDBC是J2SE的内容,是由java提供的访问数据库的接口,但没有提供具体的实现方法,需要数据库厂商提供,就是对应的数据库驱动. 这样的好处是可以方便的更换数据库,提高了扩展性.这也是面向接口编程的一个优点. 1 import java.sql.Connection; 2 import java.sql.DriverManager; 3 import java.sql.ResultSet; 4 import java.sql.SQLException; 5 import java.sql.St

使用ab.exe监测100个并发/100次请求情况下同步/异步访问数据库的性能差异

ab.exe介绍 ab.exe是apache server的一个组件,用于监测并发请求,并显示监测数据 具体使用及下载地址请参考:http://www.cnblogs.com/gossip/p/4398784.html 本文的目的 通过webapi接口模拟100个并发请求下,同步和异步访问数据库的性能差异 创建数据库及数据 --创建表结构 CREATE TABLE dbo.[Cars] ( Id INT IDENTITY(1000,1) NOT NULL, Model NVARCHAR(50) 

项目小结-JDBC访问数据库的基本步骤

JDBC访问数据库的基本步骤: (1)将数据库的JDBC驱动加载到classpath中,在基于javaEE的web应用实际开发过程中, 通常把目标产品的JDBC驱动复制到WEB-INF/lib中 (2)加载JDBC驱动,将其注册到DriverManager中 //Oracle8/8i/9i(thin模式)数据库 Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); //Sql server2005数据库 Clas

PHP 访问数据库

访问数据库步骤: 1.造一个连接对象 1 $db = new MYSQLi("localhost","root","123","mydb"); 2.判断连接是否出错 1 !mysqli_connect_error() or die("连接失败!"); 3.写SQL语句 1 $sql = "select * from Info"; 4.执行SQL语句,查询语句如果执行成功返回结果集对象,如

Java访问数据库

首先简介一下JDBC: JDBC:Java DataBase Connection. JDBC:Java数据库连接.它是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问. 它由一组用Java语言编写的类和接口组成. JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名. 一.Java访问数据库的原理: 举个例子来讲:Oracle.SQLServer.MySQL.DB2等数据库可以类比为“水厂”,Con

ADO.NET 连接方式和非链接方式访问数据库

//连接方式访问数据库的主要步骤 1.创建连接对象(l链接字符串) 2.创建命令对象(设置Command对象的几个属性值) 3.打开连接 4.发送命令 5.处理数据 6.关闭连接 //非链接方式访问数据库 1/创建连接对象 2.创建数据适配器对象 3.打开连接 4.发送命令 5.关闭连接