数据库 中 insert into 语句等操作是比较耗时的,假如我们一次性插入几百几千条数据就会造成主线程阻塞,以至于ui界面卡住。那么这时候我们就要开启一个事物来进行操作。
原因就是它以文件的形式存在磁盘中,每次访问时都要打开一次文件,如果对数据库进行大量的操作,就很慢。可是如果我们用事物的形式提交,开始事务后,进行的大量操作语句都保存在内存中,当提交时才全部写入数据库,此时,数据库文件也只用打开一次。如果操作错误,还可以回滚事务。
//
// ViewController.m
// FMDBandCocoaPods
//
// Created by 孙璐 on 17/3/13.
// Copyright © 2017年 孙璐. All rights reserved.
//
#import "ViewController.h"
#import <FMDB.h>
@interface ViewController ()
@property(nonatomic,strong)FMDatabaseQueue * queue;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSString *filePath=[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"fmdb.sqlite"];
//创建数据库,并加入到队列中,此时已经默认打开了数据库,无须手动打开,只需要从队列中去除数据库即可
self.queue=[FMDatabaseQueue databaseQueueWithPath:filePath];
//取出数据库,这里的db就是数据库,在数据库中创建表
[self.queue inDatabase:^(FMDatabase *db) {
//创建表
BOOL createTableResult=[db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT,name text,age integer)"];
if (createTableResult) {
NSLog(@"创建表成功");
}else{
NSLog(@"创建表失败");
}
}];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self delete];
[self insert];
//[self update];
[self select];
}
- (void)insert{
//操作放在事务中 节省时间 相当于给500件商品全部生产完再送出 非事务相当于生产一件送出一件
[self.queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
for (int index=0; index<50; index++) {
NSString *s_name=[NSString stringWithFormat:@"Andy%d",arc4random()%100];
NSNumber *s_age=@(arc4random()%100);
BOOL a = [db executeUpdate:@"INSERT INTO t_student(name,age) VALUES(?,?)",s_name,s_age];
//回滚(如果插入数据错误 之前的操作都抹掉)
if (!a) {
*rollback = YES;
return;
}
}
}];
}
- (void)delete{
[self.queue inDatabase:^(FMDatabase *db) {
[db executeUpdate:@"delete from t_student"];
}];
}
- (void)update{
[self.queue inDatabase:^(FMDatabase *db) {
[db executeUpdate:@"UPDATE t_student SET name='Jack' WHERE id=?",@2];
}];
}
- (void)select{
[self.queue inDatabase:^(FMDatabase *db) {
//获取结果集,返回参数就是查询结果
FMResultSet *rs=[db executeQuery:@"SELECT * FROM t_student"];
while ([rs next]) {
int ID=[rs intForColumn:@"id"];
NSString *NAME=[rs stringForColumn:@"name"];
int AGE=[rs intForColumn:@"age"];
NSLog(@"%d %@ %d",ID,NAME,AGE);
}
}];
}
@end