OC(十一):FMDB的事務(wù)封裝

FMDB我們經(jīng)常使用,是對(duì) sqlite 的一個(gè)很好的封裝.但是使用還是有點(diǎn)不太方便,索性就寫(xiě)了一個(gè) manager 類(lèi)管理,進(jìn)行 crud 操作.我們知道這四個(gè)操作中當(dāng)遇到大量數(shù)據(jù)時(shí)候,插入和更新操作是最耗時(shí)的,所以我們就要使用事務(wù)進(jìn)行操作,到達(dá)節(jié)省時(shí)間的目的,根據(jù)經(jīng)驗(yàn)再插入10W 條數(shù)據(jù)大概是2.6s, 是不是很6.那么我們就來(lái)看看吧.
.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è)計(jì)
        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(@"時(shí)間:%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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容