iOS開發(fā)之FMDB的簡單使用(單例全局)

fmdb是基于sqlite3基礎(chǔ)上進(jìn)行封裝,概念性的東西不多說,本demo采用的是隊(duì)列方式,可以保證線程安全

demo演示
//主要代碼:事務(wù)回滾,有興趣的朋友可以自行添加
@implementation DBObject

+(instancetype)sharedInstance{
    
    static DBObject *sql = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        
        sql = [[DBObject alloc]init];
    });
    return sql;
}

/**
 *  初始化字典
 *
 *  @return <#return value description#>
 */
-(NSMutableDictionary *)params{
    
    if (!_params) {
        _params = [NSMutableDictionary dictionary];
    }
    return _params;
}

/**
 *  初始化數(shù)組(查找全部)
 *
 *  @return <#return value description#>
 */
-(NSMutableArray *)Array{
    
    if (!_Array) {
        _Array = [NSMutableArray array];
    }
    return _Array;
}

/**
 *  新建數(shù)據(jù)庫+新建表
 */
-(void)addDatabaseAndTableMethod{
    
    NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)firstObject];
    //拼接文件名
    NSString *filePath = [cachePath stringByAppendingString:@"note.sqlite"];
    NSLog(@"數(shù)據(jù)庫路徑:%@",filePath);
    //創(chuàng)建數(shù)據(jù)庫,并加入到隊(duì)列中,此時(shí)已經(jīng)默認(rèn)打開了數(shù)據(jù)庫,無須手動(dòng)打開,只需要從隊(duì)列中去除數(shù)據(jù)庫即可
    self.queue = [FMDatabaseQueue databaseQueueWithPath:filePath];
    //取出數(shù)據(jù)庫,這里的db就是數(shù)據(jù)庫,在數(shù)據(jù)庫中建表
    [self.queue inDatabase:^(FMDatabase *db) {
        
        BOOL createTable = [db executeUpdate:@"create table if not exists t_note (id integer primary key autoincrement,title text,name text,password text)"];
        if (createTable) {
            NSLog(@"創(chuàng)建表成功");
        }
        else{
            NSLog(@"創(chuàng)建表失敗");
        }
    }];
}

/**
 *  新增
 */
-(void)insetTitle:(NSString *)title WithName:(NSString *)name  WithPassWord:(NSString *)password{
    
    [self.queue inDatabase:^(FMDatabase *db) {
        
        BOOL flag = [db executeUpdate:@"insert into t_note (title,name,password) values (?,?,?)",title,name,password];
        if (flag) {
            NSLog(@"新增數(shù)據(jù)成功");
        }
        else{
            NSLog(@"新增數(shù)據(jù)失敗");
        }
    }];
}

/**
 *  刪除
 */
-(void)deleteWithTitle:(NSString *)title{
    
    [self.queue inDatabase:^(FMDatabase *db) {
        
        BOOL flag = [db executeUpdate:@"delete from t_note where title = ?",title];
        if (flag) {
            NSLog(@"刪除數(shù)據(jù)成功");
        }
        else{
            NSLog(@"刪除數(shù)據(jù)失敗");
        }
    }];
}

/**
 *  更新數(shù)據(jù)
 */
-(void)updateWithNewName:(NSString *)newName WithTitle:(NSString *)title{
    
    [self.queue inDatabase:^(FMDatabase *db) {
        
        BOOL flag = [db executeUpdate:@"update t_note set name = ? where title = ?",newName,title];
        if (flag) {
            NSLog(@"更新數(shù)據(jù)成功");
        }
        else{
            NSLog(@"更新數(shù)據(jù)失敗");
        }
    }];
}

/**
 *  條件查詢數(shù)據(jù)
 */
-(void)selectWithTitle:(NSString *)title{

    [self.queue inDatabase:^(FMDatabase *db) {
        
        //獲取結(jié)果集,返回參數(shù)就是查詢結(jié)果
        FMResultSet *rs = [db executeQuery:@"select *from t_note where title = ?",title];
        while ([rs next]) {
            
            self.title = [rs stringForColumn:@"title"];
            self.name = [rs stringForColumn:@"name"];
            self.password = [rs stringForColumn:@"password"];
            NSLog(@"平臺(tái):%@---用戶名:%@----密碼:%@",self.title,self.name,self.password);
            
            //先將數(shù)據(jù)存放到字典
            NSMutableDictionary *dic = [NSMutableDictionary dictionary];
            [dic setObject:self.title forKey:@"dictTitle"];
            [dic setObject:self.name forKey:@"dictName"];
            [dic setObject:self.password forKey:@"dictPwd"];
            
            //然后將字典存放到數(shù)組
            [self.Array addObject:dic];
        }
        

    }];
}

/**
 *  查詢所有數(shù)據(jù)
 *
 */
-(void)selectAllMethod{
    
    //每次進(jìn)來查詢的時(shí)候,先清除上次緩存數(shù)據(jù)
    [self.Array removeAllObjects];
    [self.queue inDatabase:^(FMDatabase *db) {
        
        //獲取結(jié)果集,返回參數(shù)就是查詢結(jié)果
        FMResultSet *rs = [db executeQuery:@"select *from t_note"];
        while ([rs next]) {
            
            self.title = [rs stringForColumn:@"title"];
            self.name = [rs stringForColumn:@"name"];
            self.password = [rs stringForColumn:@"password"];
            NSLog(@"平臺(tái):%@---用戶名:%@----密碼:%@",self.title,self.name,self.password);
            
            //先將數(shù)據(jù)存放到字典
            NSMutableDictionary *dic = [NSMutableDictionary dictionary];
            [dic setObject:self.title forKey:@"dictTitle"];
            [dic setObject:self.name forKey:@"dictName"];
            [dic setObject:self.password forKey:@"dictPwd"];
            
             //然后將字典存放到數(shù)組
            [self.Array addObject:dic];
            
        }
        
       
        NSLog(@"存放的數(shù)組:%@==%ld",self.Array,self.Array.count);
        [[NSUserDefaults standardUserDefaults]setObject:self.Array forKey:@"Arry"];
        [[NSUserDefaults standardUserDefaults]synchronize];
    }];
    
   
    
}

/**
 *  事務(wù)回滾寫法1: (如果要保證多個(gè)操作同時(shí)成功或者同時(shí)失敗,用事務(wù),即把多個(gè)操作放在同一個(gè)事務(wù)中。)
 */
-(void)updateFailure:(id)sender{
    
    [self.queue inDatabase:^(FMDatabase *db) {
        
        [db beginTransaction];
        [db executeUpdate:@"update t_note set name = 'jack' where password = ?",@"12"];
        [db executeUpdate:@"update t_note set name = 'tony' where password = ?",@"13"];
        //發(fā)現(xiàn)情況不對(duì),主動(dòng)回滾用下面語句.否則是根據(jù)commit結(jié)果,如成功就成功,如不成功才回滾
        [db rollback];
        [db executeUpdate:@"update t_note set name = '回滾' where password = ?",@"13"];
        [db commit];
    }];
}

/**
 *  事務(wù)回滾寫法2:(直接利用隊(duì)列進(jìn)行事務(wù)操作,隊(duì)列中的打開、關(guān)閉、回滾事務(wù)等都已經(jīng)被封裝好了)
 */
-(void)updateFailure02:(id)sender{
    
    [self.queue inDatabase:^(FMDatabase *db) {
        
        [self.queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
            
            [db executeUpdate:@"update t_note set name = 'jack' where password = ?",@"12"];
            [db executeUpdate:@"update t_note set name = 'tony' where password = ?",@"13"];
            //發(fā)現(xiàn)情況不對(duì),主動(dòng)回滾用下面語句
            *rollback = YES;
            [db executeUpdate:@"update t_note set name = '回滾' where password = ?",@"13"];
            
        }];
    }];
}

/**
 *  回滾的原生代碼:
 [db executeUpdate:@"BEGIN TRANSACTION"];
 [db executeUpdate:@"ROLLBACK TRANSACTION"];
 [db executeUpdate:@"COMMIT TRANSACTION"];
 */

demo鏈接:https://github.com/OwenJoe/FMDB.git

iOS開發(fā)之FMDB圖片的增刪查改,請(qǐng)參閱:
鏈接:http://www.itdecent.cn/p/6edcfe58aaf0

最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 26,135評(píng)論 7 249
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議。它實(shí)...
    香橙柚子閱讀 24,769評(píng)論 8 183
  • 一、斷點(diǎn) 1、文件行斷點(diǎn),直接在某一行斷點(diǎn)!執(zhí)行到特定文件某一行時(shí)觸發(fā)! 使用方法:直接點(diǎn)擊該文件的行號(hào)即可,可以...
    海浪萌物閱讀 927評(píng)論 0 0
  • 今天早上對(duì)娃發(fā)火了,事后很自責(zé)和內(nèi)疚,感覺到一種無力感,仿佛我會(huì)一直這種狀態(tài),我做不了好媽媽,意識(shí)到自己內(nèi)心...
    陽光灑灑閱讀 321評(píng)論 0 1
  • 曾無數(shù)次的想象過 和這座城市再次相遇的場景 直至今日 時(shí)隔兩載 再次踏上這片土地 方知內(nèi)心竟是平靜而又復(fù)雜的 可...
    一只小松閱讀 376評(píng)論 0 2

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