FMDB数据库队列

iOS开发数据库篇—FMDB数据库队列

一、代码示例

1.需要先导入FMDB框架和头文件,由于该框架依赖于libsqlite库,所以还应该导入该库。

FMDB数据库队列_第1张图片

2.代码如下:

复制代码
 1 //
 2 // YYViewController.m  3 // 05-FMDB数据库队列  4 //
 5 // Created by apple on 14-7-28.  6 // Copyright (c) 2014年 wendingding. All rights reserved.  7 //  8 
 9 #import "YYViewController.h"
10 #import "FMDB.h"
11 
12 @interface YYViewController () 13 @property(nonatomic,strong)FMDatabaseQueue *queue; 14 @end
15 
16 @implementation YYViewController 17 
18 - (void)viewDidLoad 19 { 20  [super viewDidLoad]; 21     
22     //1.获得数据库文件的路径
23     NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 24     NSString *fileName=[doc stringByAppendingPathComponent:@"person.sqlite"]; 25     
26     //2.获得数据库队列
27     FMDatabaseQueue *queue=[FMDatabaseQueue databaseQueueWithPath:fileName]; 28 // FMDatabase *db=[FMDatabase databaseWithPath:fileName]; 29     
30     //3.打开数据库
31     [queue inDatabase:^(FMDatabase *db) { 32          BOOL result=[db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"]; 33         if (result) { 34             NSLog(@"创表成功"); 35         }else
36  { 37             NSLog(@"创表失败"); 38  } 39  }]; 40     self.queue=queue; 41     
42 } 43 
44 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
45 { 46     //插入数据 47 // [self.queue inDatabase:^(FMDatabase *db) { 48 // [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22]; 49 // }]; 50     
51     //查询数据
52     [self.queue inDatabase:^(FMDatabase *db) { 53         // 1.执行查询语句
54         FMResultSet *resultSet = [db executeQuery:@"SELECT * FROM t_person"]; 55 
56         // 2.遍历结果
57         while ([resultSet next]) { 58             int ID = [resultSet intForColumn:@"id"]; 59             NSString *name = [resultSet stringForColumn:@"name"]; 60             int age = [resultSet intForColumn:@"age"]; 61             NSLog(@"%d %@ %d", ID, name, age); 62  } 63  }]; 64 
65 } 66 
67 @end
复制代码

先插入数据,之后查询结果,打印如下:

3.代码说明

有了一个队列对象,它的内部自动就拥有一个数据库对象,且数据库的操作是线程安全的。
 
二、事务
事务,没有事务的话会出现问题。
举例:银行的例子
 
张三和李四账户都有1000块钱,如果张三要转账给李四,需要执行两条SQL语句,考虑到安全性,要求这两条鱼具要么全部执行成功,要不全部执行失败。
事务:把多条语句放到同一个事务中,要么全部成功,要不全部失败(如果中途出现问题,那么会自动回滚)。事务的执行具有原子性。
  事务代码处理:
  把多条语句添加到一个事务中去执行:
复制代码
1    //插入数据
2     [self.queue inDatabase:^(FMDatabase *db) { 3  [db beginTransaction]; 4         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22]; 5         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @23]; 6         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @24]; 7         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @25]; 8  [db commit]; 9     }];
复制代码

如果中途出现问题,那么会自动回滚,也可以选择手动回滚。

复制代码
 1     //插入数据
 2     [self.queue inDatabase:^(FMDatabase *db) {  3  [db beginTransaction];  4         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22];  5         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @23];  6         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @24];  7  [db rollback];  8         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @25];  9  [db commit]; 10     }];
复制代码

上面的代码。前三条插入语句是作废的。

事务处理的另一种方式:

1    [self.queue inTransaction:^(FMDatabase *db, BOOL *rollback) { 2         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22]; 3         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @23]; 4         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @24]; 5     }];

你可能感兴趣的:(FMDB数据库队列)