fm数据库-斯科尔斯 fm数据
发布时间:2023-02-09 14:08 浏览次数:次 作者:佚名
物与非物
事物是并发控制的基本单元。 所谓事务就是一系列的操作。 这些操作要么执行,要么不执行。 它是一个不可分割的工作单元。
物与非物,举个简单的例子,物就是把所有的东西打包在一起,一次性处理。 它们不是事务,而是一个接一个地执行和处理。
数据库存储路径
- (NSString *)dbPath{
NSString *dbPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"FMDB.sqlite"];
return dbPath;
}
非事务性先创建队列
FMDatabaseQueue *dabaseQueue = [FMDatabaseQueue databaseQueueWithPath:[self dbPath]];
向非事务处理中添加一组操作
[dabaseQueue inDatabase:^(FMDatabase *db) {
BOOL iserror = NO;
int temp = -1;
for (int i = 0; i < 10000000; i++) {
iserror = [db executeUpdate:@"insert into stu values (?)",@(i)];
if (!iserror) {//说明iserror == NO插入有问题了。
if (temp == -1) {
temp = i;//在这里记录出错的条数
}
}
}
if (iserror) {
NSLog(@"所有插入操作成功");
}else{
NSLog(@"插入操作失败%d",temp);
}
}];
这里我们要向数据库中插入10,000,000条数据。 当使用非事务处理时fm数据库,会一条一条插入到数据库中fm数据库,来回往复,直到所有数据都插入,耗费大量时间。
事物
还是上面的代码,我们只需要做一些小改动就可以实现对事物的一个处理
FMDatabaseQueue *dabaseQueue = [FMDatabaseQueue databaseQueueWithPath:[self dbPath]];
//将一组操作添加到非事务处理中
[dabaseQueue inDatabase:^(FMDatabase *db) {
/**
* 操作放入事物中(加入事物操作)
*/
[db beginTransaction];
BOOL iserror = NO;
int temp = -1;
for (int i = 0; i < 10000000; i++) {
iserror = [db executeUpdate:@"insert into stu values (?)",@(i)];
if (!iserror) {//说明iserror == NO插入有问题了。
if (temp == -1) {
temp = i;
}
}
}
if (iserror) {
NSLog(@"所有插入操作成功");
}else{
NSLog(@"插入操作失败%d",temp);
}
/**
* 提交事物
*/
[db commit];
}];
上面的方法是通过我们手动给事物添加操作,然后手动提交。
其实FMDB已经帮我们封装了一个处理方法
示例代码
创建队列
FMDatabaseQueue *dataBaseQueue = [FMDatabaseQueue databaseQueueWithPath:[self dbPath]];
给事物添加操作
[dataBaseQueue inTransaction:^(FMDatabase *db, BOOL *rollback) {
NSLog(@"开始插入数据");
BOOL iserror = NO;
for (int i = 0; i < 10000000; i++) {
iserror = [db executeUpdate:@"insert into stu values (?)",@(i)];
}
if (iserror) {
NSLog(@"所有操作成功");
}
}];
这个方法内部已经帮我们完成了对事物添加操作和提交事物的操作。 我们只需要在方法中添加操作即可。