上篇博文介绍FMDB安全性问题,今天介绍FMDB的“事物”及离线缓存
一、事物:
通常一次 sqlite3_exec 就是一次事务,假如你要对数据库中的Stutent表插入新数据,那么该事务的具体过程是:开始新事物->插入数据->提交事务,那么当我们要往该表内插入500条数据,如果按常规操作处理就要执行500次“开始新事物->插入数据->提交事务”的过程。
通常事物用来对数据库进行批量操作时会用到,优点:节省时间;
另一种情况:两种不同的DML语句去操作同一字段,开启事物,这样可以保证字段对应数据的准确性。
举个例子:如果t_student这张表需要同时插入500名学生的信息,若不开启事物逐条执行,就是插入一条保存一条,如果反复效率不高;若开启事物的500条记录,只有到提交事物的时候才会依次执行DML语句,且若DML语句有错误的话系统会进行回滚,效率很高。
直接上代码:
- (void)updateStudentInfor{
//1. 第一种写法
queue initDatabase^(FMDatabase *db){
//1.1 开启事物
[db excuteUpdate:@" begin transaction "]; // or [ db beginTransaction ];
//2. 执行DML语句
for (int i = 0; i < 500; i++){
NSArray *names = @[@"Kobe",@"Curry",@"James",@"Ducan",@"O'Neal"];
int index = arc4random()%names.count;
NSSting *namePre = names[index];
NSString *name = [NSString stringWithFormat@" %@_%d ", namePre, arc4random() % 500 ];
int age = arc4random() % 500;
[ db excuteUpdate:@"insert into t_student (name, age) values ( ?, ?); " ,name ,age ];
}
//3. 判断是否回滚
[ db excuseUpDate:@"rollback transaction" ]; // or [ db rollback ];
//4. 提交事物
[db excuteUpDate:@"commit transsaction"]; // or [ db commit ];
}
}