FMDB----2:多线程使用.
2016-04-26 本文已影响73人
箫声_筱昇
先引入头文件
#import <FMDB/FMDB.h>
- 注意:在 viewDidLoad引用.
- (void)viewDidLoad {
[super viewDidLoad];
//打开数据库
[self openDB];
//在子线程中,执行数据库插入操作
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[self threadNotTransaction];
});
}
- 数据库文件存储的路径
- (NSString*)dbPath{
NSString *dbPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *docPath = [dbPath stringByAppendingPathComponent:@"test.sqlite"];
NSLog(@"%@",dbPath);
return docPath;
}
- 打开数据库并建表
- (void)openDB{
FMDatabase *database = [FMDatabase databaseWithPath:[self dbPath]];
/**
* 打开数据库,如果数据库打开成功,建表.如果打开失败就返回错误信息
*/
if([database open]){
BOOL isSuccess = [database executeUpdate:@"create table if not exists stu (name text)"];
if (isSuccess) {
NSLog(@"建表成功");
}else{
NSLog(@"建表失败");
}
}else{
NSLog(@"打开数据库失败");
}
}
- 多线程操作数据库时, 非事务的处理方式
- (void)threadNotTransaction{
//数据库文件的路径
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:[self dbPath]];
//将一组操作添加到非事务中
[queue inDatabase:^(FMDatabase *db) {
[db beginTransaction];//该句是将操作放入事务中 添加入事务操作.在不加本句时.该操作只是,该队列是串行队列,在运行时效率较慢.
BOOL isError = NO;
int temp = -1;
for (int i = 0 ; i < 10000; 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];//注意:在将操作添加到事务操作中后,一定要提交事务.
}];
}