使用FMDB框架来操作数据库

一、什么是FMDB
FMDB是iOS平台的SQLite数据库框架,以OC的方式封装了SQLite的C语言API
二、FMDB的优点
1、使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码

2、对比苹果自带的Core Data框架,更加轻量级和灵活
3、提供了多线程安全的数据库操作方法,有效地防止数据混乱
三、FMDB的三个主要类
1、FMDatabase
一个FMDatabase对象就代表一个单独的SQLite数据库,用来执行SQL语句
(1)、使用FMDatabase打开数据库
[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片

  1. // 拼接数据库地址
  2.     NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
  3.     NSString *sqlFile = [path stringByAppendingPathComponent:@”student.sqlite”];
  4.     // 该方法接收一个地址, 它会根据地址创建一个数据, 如果不存在就会自动创建
  5.     FMDatabase *db = [FMDatabase databaseWithPath:sqlFile];
  6.     if([db open]){
  7.         // 创建表
  8.         NSString *sql = @”CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT , name TEXT, age INTEGER, score REAL);”;
  9.         // 在FMDB中除了查询以外的操作都称之为更新
  10.         if([db executeUpdate:sql]){
  11.             NSLog(@”创建表成功”);
  12.         }
  13.     }
(2)、使用FMDatabase执行更新
[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片

  1. NSString *sql = @”INSERT INTO t_student(age, score, name) VALUES (’28’, 100, ‘jonathan’);”;
  2.     if([self.db executeUpdate:sql])
  3.     {
  4.         NSLog(@”插入成功”);
  5.     }
相比较于使用SQLite,FMDB只需一条sql语句,一个执行代码就完成了。
2、FMResultSet
使用FMDatabase执行查询后的结果集。
结合FMDatabase,实现数据库的查询操作
[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片

  1. NSString *sql = @”SELECT * FROM t_student;”;
  2.     // 查询数据, 会将所有查询到得数据, 放到results中
  3.     FMResultSet *results = [self.db executeQuery:sql];
  4.     // 从results中获取数据
  5.     while ([results next]) {
  6.         NSString *name = [results stringForColumn:@”name”];
  7.         int age = [results intForColumn:@”age”];
  8.         double score = [results doubleForColumn:@”score”];
  9.         NSLog(@”%@ %d %f”, name, age, score);
  10.           }
3、FMDatabaseQueue
用于在多线程中执行多个查询或更新,它是线程安全的,即不会出现脏数据或脏读
(1)、使用FMDatabaseQueue执行更新
[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片

  1. // 拼接数据库地址
  2.     NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
  3.     NSString *sqlFile = [path stringByAppendingPathComponent:@”student.sqlite”];
  4.     // 该方法接收一个地址, 它会根据地址创建一个数据, 如果不存在就会自动创建
  5.     // 创建一个数据库队列
  6.     FMDatabaseQueue *dbQueue = [FMDatabaseQueue databaseQueueWithPath:sqlFile];
  7.     //只要调用dbQueue的inDatabase方法, 系统就会传递一个已经打开并且线程安全的数据库给我们
  8.     [dbQueue inDatabase:^(FMDatabase *db) {
  9.         // 创建表
  10.         NSString *sql = @”CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT , name TEXT, age INTEGER, score REAL);”;
  11.         if([db executeUpdate:sql]){
  12.             NSLog(@”创建表成功”);
  13.         }
  14.     }];
(2)、使用FMDatabaseQueue执行查询
[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片

  1. [dbQueue inDatabase:^(FMDatabase *db) {
  2.         NSString *sql = @”SELECT * FROM t_student;”;
  3.         // 查询数据, 会将所有查询到得数据, 放到results中
  4.         FMResultSet *results = [db executeQuery:sql];
  5.         // 从results中获取数据
  6.         while ([results next]) {
  7.             NSString *name = [results stringForColumn:@”name”];
  8.             int age = [results intForColumn:@”age”];
  9.             double score = [results doubleForColumn:@”score”];
  10.             NSLog(@”%@ %d %f”, name, age, score);
  11.         }
  12.     }];
(3)、使用FMDatabaseQueue实现事务
利用FMDatabaseQueue的事务管理,我们可以同时执行多条sql语句,这样的好处就是要不所有的sql语句执行成功,要不所有的sql语句执行失败,该特性一般都会应用于银行业务中。
[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片

  1. [self.dbQueue inDatabase:^(FMDatabase *db) {
  2.         // 告诉系统开启事务, 只要开启事务之后, 但凡没有看到提交事务(事务结束), 那么中间执行的任何语句都将无效
  3.         [db beginTransaction];
  4.         NSString *sql1 = @”UPDATE t_student SET money = 500 WHERE name = ‘cx'”;
  5.         NSString *sql2 = @”UPDATE t_student SET money = 1500 WHERE name = ‘wj'”;
  6.         [db executeUpdate:sql1];
  7.         [db executeUpdate:sql2];
  8.         // 提交事务(结束事务)
  9.         [db commit];
  10.     }];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值