12. FMDatabaseQueue的简单使用
2016-06-17 本文已影响2605人
面糊
-
为什么要使用FMDatabaseQueue
- FMDatabase这个类, 他不是线程安全的, 如果在多个线程中同时使用一个FMDataBase对象来存取数据的话, 有可能会发生数据错乱
- 因此为了保证线程安全, 要使用FMDatabaseQueue这个类来操作数据
- FMDatabaseQueue这个类, 还提供了在一个SQL字符串中, 同时编写多个代码的方法, 因此使用起来十分的效率
-
简单的代码实现
#import "DataBaseTool.h" #import "FMDatabase.h" #import "FMDatabaseQueue.h" static DataBaseTool *_instance; @interface DataBaseTool () @property (nonatomic, strong) FMDatabaseQueue *queue; @end @implementation DataBaseTool + (instancetype)shareInstance { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [[self alloc] init]; }); return _instance; } // 懒加载数据库队列 - (FMDatabaseQueue *)queue { if (_queue == nil) { _queue = [FMDatabaseQueue databaseQueueWithPath:@"/Users/fanghe/Desktop/数据库/demo.sqlite"]; } return _queue; } // 创建表 - (void)createTableWithSQL:(NSString *)sql { [self.queue inDatabase:^(FMDatabase *db) { BOOL result = [db executeUpdate:sql withArgumentsInArray:nil]; if (result) { NSLog(@"创建表格成功"); } else { NSLog(@"创建表格失败"); } }]; } // 删除表格 - (void)dropTableWithSQL:(NSString *)sql { [self.queue inDatabase:^(FMDatabase *db) { BOOL result = [db executeUpdate:sql withArgumentsInArray:nil]; if (result) { NSLog(@"删除表格成功"); } else { NSLog(@"删除表格失败"); } }]; } // 插入数据 - (void)insertDataWithSQL:(NSString *)sql { [self.queue inDatabase:^(FMDatabase *db) { BOOL result = [db executeUpdate:sql withArgumentsInArray:nil]; if (result) { NSLog(@"插入数据成功"); } else { NSLog(@"插入数据失败"); } }]; } // 查询所有数据 - (void)queryAll { [self.queue inDatabase:^(FMDatabase *db) { NSString *sql = @"select * from T_human"; FMResultSet *resultSet = [db executeQuery:sql withArgumentsInArray:nil]; while (resultSet.next) { NSString *name = [resultSet stringForColumn:@"name"]; int age = [resultSet intForColumn:@"age"]; double height = [resultSet doubleForColumn:@"height"]; NSLog(@"%@, %i, %lf", name, age, height); } }]; } // 执行多条语句 - (void)excuteStaments { NSString *sql = @"insert into T_human(name, age, height) values('wangwu', 15, 170);insert into T_human(name, age, height) values('zhaoliu', 13, 160);"; [self.queue inDatabase:^(FMDatabase *db) { BOOL result = [db executeStatements:sql]; if (result) { NSLog(@"执行多条语句成功"); } else { NSLog(@"执行多条语句失败"); } }]; } // 开启事务执行语句 - (void)transaction { [self.queue inTransaction:^(FMDatabase *db, BOOL *rollback) { NSString *sql = @"insert into T_human(name, age, height) values('wangwu', 15, 170);insert into T_human(name, age, height) values('zhaoliu', 13, 160);"; NSString *sql2 = @"insert into T_human(name, age, height) values('zhaoliu', 13, 160);insert into T_human(name, age, height) values('wangwu', 15, 170);"; BOOL result1 = [db executeUpdate:sql withArgumentsInArray:nil]; BOOL result2 = [db executeUpdate:sql2 withArgumentsInArray:nil]; if (result1 && result2) { NSLog(@"执行成功"); } else { [db rollback]; } }]; } @end