FMDB我們經(jīng)常使用,是對 sqlite 的一個很好的封裝.但是使用還是有點(diǎn)不太方便,索性就寫了一個 manager 類管理,進(jìn)行 crud 操作.我們知道這四個操作中當(dāng)遇到大量數(shù)據(jù)時候,插入和更新操作是最耗時的,所以我們就要使用事務(wù)進(jìn)行操作,到達(dá)節(jié)省時間的目的,根據(jù)經(jīng)驗(yàn)再插入10W 條數(shù)據(jù)大概是2.6s, 是不是很6.那么我們就來看看吧.
.h
//
// FMDBManager.h
// FMDBManager
//
// Created by HMC on 2016/10/31.
// Copyright ? 2016年 HMC. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface FMDBManager : NSObject
//需要使用事務(wù)
-(BOOL)insert;
-(BOOL)update;
//arr 查詢條件
-(NSArray *)select:(NSArray *)arr;
//arr 刪除的條件
-(void)delete:(NSArray *)arr;
@end
.m 采用單例模式設(shè)置
//
// FMDBManager.m
// FMDBManager
//
// Created by HMC on 2016/10/31.
// Copyright ? 2016年 HMC. All rights reserved.
//
#import "FMDBManager.h"
#import "FMDB.h"
@interface FMDBManager()
@property (strong, nonatomic) FMDatabaseQueue * fmdbQueue;
@end
@implementation FMDBManager
-(instancetype)init{
if ( self = [super init]) {
//單例模式設(shè)計
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"%@",[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"user.db"]);
_fmdbQueue = [FMDatabaseQueue databaseQueueWithPath:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"user.db"]];
[_fmdbQueue inDatabase:^(FMDatabase *db) {
if ([db executeUpdate:@"create table if not exists user (userid integer primary key autoincrement , username text)"]) {
NSLog(@"create table success");
}else{
NSLog(@"create table error");
}
}];
});
}
return self;
}
-(BOOL)insert{
__block BOOL isSuccess = NO;
NSString * sql = @"insert into user (username) values ('SJW')";
[_fmdbQueue inTransaction:^(FMDatabase *db, BOOL *rollback) {
@try {
CFTimeInterval start= CFAbsoluteTimeGetCurrent();
//for (int i= 0 ; i< 100000; i++) {
[db executeUpdate:sql];
//}
NSLog(@"時間:%f",CFAbsoluteTimeGetCurrent()-start);
} @catch (NSException *exception) {
*rollback = YES;
} @finally {
*rollback = NO;
isSuccess = YES;
}
}];
return isSuccess;
}
-(BOOL)update{
__block BOOL isSuccess = NO;
NSString * sql = @"update user set username = 'SJW'";
[_fmdbQueue inTransaction:^(FMDatabase *db, BOOL *rollback) {
@try {
[db executeUpdate:sql];
} @catch (NSException *exception) {
//失敗了 就回滾數(shù)據(jù)
*rollback = YES;
} @finally {
*rollback = NO;
isSuccess = YES;
}
}];
return isSuccess;
}
-(NSArray *)select:(NSArray *)arr{
NSMutableArray * arrs = [NSMutableArray array];
NSString * sql = @"select * from user where 1 = 1";
if (arr) {
for (NSString * str in arr) {
[sql stringByAppendingString:[NSString stringWithFormat:@"and %@",str]];
}
}
[_fmdbQueue inDatabase:^(FMDatabase *db) {
FMResultSet *result = [db executeQuery:sql];
while ([result next]) {
NSString * username= [result stringForColumn:@"username"];
NSLog(@"%@",username);
[arrs addObject:username];
}
}];
return arrs;
}
-(void)delete: (NSArray *) arr{
NSString * sql = @"DELETE from user where 1 = 1 ";
if (arr) {
for (NSString * str in arr) {
[sql stringByAppendingString:[NSString stringWithFormat:@"and %@",str]];
}
}
[_fmdbQueue inDatabase:^(FMDatabase *db) {
FMResultSet *result = [db executeQuery:sql];
while ([result next]) {
NSString * username= [result stringForColumn:@"username"];
NSLog(@"%@",username);
}
}];
}
@end
調(diào)用
//
// ViewController.m
// FMDBManager
//
// Created by HMC on 2016/10/31.
// Copyright ? 2016年 HMC. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
FMDBManager * ma = [[FMDBManager alloc]init];
[ma insert];
[ma select:@[@"username = 'SJW'"]];
// [ma update];
[ma delete:@[@"username = 'songjinwei'"]];
}
@end