12歌亲、簡(jiǎn)單數(shù)據(jù)庫(kù)的封裝

#import "DataBaseHelper.h"
#import <sqlite3.h>

@interface DataBaseHelper (){
    sqlite3* sqliteHandle;
}
@property(nonatomic,retain)NSString* dbFileName;//數(shù)據(jù)庫(kù)文件路徑
@end

@implementation DataBaseHelper

+(DataBaseHelper*)sharedDataBaseHelper{
    static DataBaseHelper* dbHelper=nil;
    if (dbHelper==nil) {
        dbHelper=[[DataBaseHelper alloc] init];
    }
    return dbHelper;
}

//創(chuàng)建數(shù)據(jù)庫(kù)文件存儲(chǔ)的路徑,一般在documents和library/caches

-(void)dbFileNameWithName:(NSString*)fileName{
    //將fileName中的空格替換掉
    fileName = [fileName stringByReplacingOccurrencesOfString:@" " withString:@""];
    
    //判斷用戶傳遞進(jìn)來(lái)的文件名是否為nil或者為空字符串
    if (fileName) {
        //判斷文件名是否為空字符串
        if (fileName.length == 0) {
            //空字符串@""
             NSLog(@"數(shù)據(jù)庫(kù)文件無(wú)名稱,當(dāng)程序關(guān)閉的時(shí)候踪栋,數(shù)據(jù)庫(kù)文件也會(huì)銷毀");
        }else{
            //判斷文件名是否帶后綴名倦青,如果有就直接使用,如果沒(méi)有芜茵,就添加后綴名之后在使用
            if (![fileName hasSuffix:@".sqlite"]) {
                //如果沒(méi)有后綴名叙量,添加后綴名之后在使用
                fileName = [fileName stringByAppendingString:@".sqlite"];
            }
            
        }
    }else{
        //說(shuō)明文件名為nil
        NSLog(@"數(shù)據(jù)庫(kù)文件無(wú)名稱,當(dāng)程序關(guān)閉的時(shí)候,數(shù)據(jù)庫(kù)文件也會(huì)銷毀");
        fileName=@"";
    }
    //將文件名稱拼接成有效的文件路徑
    NSString* docPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
    fileName=[docPath stringByAppendingPathComponent:fileName];
    //將處理好的文件名賦值給屬性九串,讓其他方法使用
    self.dbFileName=fileName;
    
}

//打開(kāi)或者創(chuàng)建數(shù)據(jù)庫(kù)文件
-(sqlite3*)creatDB{
    int result=sqlite3_open(self.dbFileName.UTF8String, &sqliteHandle);
    if (result==SQLITE_OK) {
         NSLog(@"創(chuàng)建或者打開(kāi)數(shù)據(jù)庫(kù)成功");
        return sqliteHandle;
    }else{
        NSLog(@"創(chuàng)建或者打開(kāi)數(shù)據(jù)庫(kù)失敗----%d",result);
        return NULL;
    }
    
}

//無(wú)返回結(jié)果集執(zhí)行的方法
-(BOOL)noQueryWithSql:(NSString*)sql{
    //執(zhí)行任何數(shù)據(jù)庫(kù)操作之前绞佩,先打開(kāi)數(shù)據(jù)庫(kù);操作執(zhí)行完畢之后記得關(guān)閉數(shù)據(jù)庫(kù)
    sqlite3* sqlite=[self creatDB];
    //執(zhí)行sql語(yǔ)句
    if (sqlite) {//保證數(shù)據(jù)庫(kù)打開(kāi)成功
        int result=sqlite3_exec(sqlite, sql.UTF8String, NULL, NULL, NULL);
        //當(dāng)操作有結(jié)果的時(shí)候一定要關(guān)閉數(shù)據(jù)庫(kù)
        sqlite3_close(sqlite);
        if (result==SQLITE_OK) {
            NSLog(@"執(zhí)行非查詢操作成功");
            return YES;
        }else{
            NSLog(@"執(zhí)行非查詢操作失敗-----%d",result);
            return NO;
        }
    }
    //說(shuō)明數(shù)據(jù)庫(kù)打開(kāi)失敗
    NSLog(@"執(zhí)行查詢操作的時(shí)候猪钮,打開(kāi)數(shù)據(jù)庫(kù)失敗了");
    return NO;
   
   
}

//通用查詢方法
-(NSArray*)queryWithSql:(NSString*)sql{
    //打開(kāi)數(shù)據(jù)庫(kù)
    sqlite3* sqlite=[self creatDB];
    //創(chuàng)建可變數(shù)組品山,用來(lái)存放所有的記錄
    NSMutableArray* resultMArray=[[NSMutableArray alloc] init];
    //聲明伴隨指針,用來(lái)存放所有的記錄
    sqlite3_stmt* stmt=NULL;
    //預(yù)執(zhí)行
    int result=sqlite3_prepare(sqlite, sql.UTF8String, -1, &stmt, NULL);
    if (result==SQLITE_OK) {
        //說(shuō)明sql語(yǔ)句沒(méi)有問(wèn)題
        NSLog(@"執(zhí)行查詢操作成功");
        //從伴隨指針中取出每一條記錄
        while (sqlite3_step(stmt)==SQLITE_ROW) {
            //每執(zhí)行一次循環(huán)體烤低,就取出一條記錄
            NSMutableDictionary* mDic=[[NSMutableDictionary alloc] init];
            //確定改條記錄有幾個(gè)字段
            int sumColumn=sqlite3_column_count(stmt);
            //for循環(huán)遍歷一條記錄中的所有字段
            for (int i=0; i<sumColumn; i++) {
                //獲取當(dāng)前列的數(shù)據(jù)類型
               int type = sqlite3_column_type(stmt, i);
                //獲取字段名
               const char * name = sqlite3_column_name(stmt, i);
                NSString* key=[NSString stringWithCString:name encoding:NSUTF8StringEncoding];
                
                //取出每一列的值
                switch (type) {
                    case SQLITE_INTEGER:{
                        //int類型
                        int value=sqlite3_column_int(stmt, i);
                        //為字典賦值
                        [mDic setObject:@(value) forKey:key];
                        
                    }
                 
                        break;
                    case SQLITE_TEXT:{
                        //字符串類型
                       const unsigned char* value=sqlite3_column_text(stmt, i);
                        NSString* valueStr=[NSString stringWithCString:( const char *)value encoding:NSUTF8StringEncoding];
                        [mDic setObject:valueStr forKey:key];
                        
                    }
                        break;
                        
                    default:
                        break;
                }
            }
            
          //一次for循環(huán)結(jié)束肘交,一條記錄才轉(zhuǎn)換為一個(gè)字典
            [resultMArray addObject:mDic];
           
        }
        
    }else{
         //說(shuō)明sql語(yǔ)句有問(wèn)題
        NSLog(@"執(zhí)行查詢操作失敗-----%d",result);
       
    }
    
    //將伴隨指針?biāo)钟械馁Y源釋放掉,關(guān)閉數(shù)據(jù)庫(kù)
    sqlite3_finalize(stmt);
    sqlite3_close(sqlite);
    //while循環(huán)結(jié)束,說(shuō)明所有的記錄都已經(jīng)獲取完整
    return resultMArray;
    
}

@end

以上方法均在.h中聲明即可

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末扑馁,一起剝皮案震驚了整個(gè)濱河市涯呻,隨后出現(xiàn)的幾起案子凉驻,更是在濱河造成了極大的恐慌,老刑警劉巖复罐,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沿侈,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡市栗,警方通過(guò)查閱死者的電腦和手機(jī)缀拭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)填帽,“玉大人蛛淋,你說(shuō)我怎么就攤上這事〈垭纾” “怎么了褐荷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)嘹悼。 經(jīng)常有香客問(wèn)我叛甫,道長(zhǎng),這世上最難降的妖魔是什么杨伙? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任其监,我火速辦了婚禮,結(jié)果婚禮上限匣,老公的妹妹穿的比我還像新娘抖苦。我一直安慰自己,他們只是感情好米死,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布锌历。 她就那樣靜靜地躺著,像睡著了一般峦筒。 火紅的嫁衣襯著肌膚如雪究西。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天物喷,我揣著相機(jī)與錄音卤材,去河邊找鬼。 笑死脯丝,一個(gè)胖子當(dāng)著我的面吹牛商膊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宠进,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼晕拆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起实幕,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吝镣,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后昆庇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體末贾,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年整吆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拱撵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡表蝙,死狀恐怖拴测,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情府蛇,我是刑警寧澤集索,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站汇跨,受9級(jí)特大地震影響务荆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜穷遂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一函匕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧塞颁,春花似錦浦箱、人聲如沸吸耿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)咽安。三九已至伴网,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妆棒,已是汗流浹背澡腾。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留糕珊,地道東北人动分。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像红选,于是被迫代替她去往敵國(guó)和親澜公。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容