12、簡單數(shù)據(jù)庫的封裝

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

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

@implementation DataBaseHelper

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

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

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

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

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

//通用查詢方法
-(NSArray*)queryWithSql:(NSString*)sql{
    //打開數(shù)據(jù)庫
    sqlite3* sqlite=[self creatDB];
    //創(chuàng)建可變數(shù)組,用來存放所有的記錄
    NSMutableArray* resultMArray=[[NSMutableArray alloc] init];
    //聲明伴隨指針,用來存放所有的記錄
    sqlite3_stmt* stmt=NULL;
    //預執(zhí)行
    int result=sqlite3_prepare(sqlite, sql.UTF8String, -1, &stmt, NULL);
    if (result==SQLITE_OK) {
        //說明sql語句沒有問題
        NSLog(@"執(zhí)行查詢操作成功");
        //從伴隨指針中取出每一條記錄
        while (sqlite3_step(stmt)==SQLITE_ROW) {
            //每執(zhí)行一次循環(huán)體,就取出一條記錄
            NSMutableDictionary* mDic=[[NSMutableDictionary alloc] init];
            //確定改條記錄有幾個字段
            int sumColumn=sqlite3_column_count(stmt);
            //for循環(huán)遍歷一條記錄中的所有字段
            for (int i=0; i<sumColumn; i++) {
                //獲取當前列的數(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)結束,一條記錄才轉(zhuǎn)換為一個字典
            [resultMArray addObject:mDic];
           
        }
        
    }else{
         //說明sql語句有問題
        NSLog(@"執(zhí)行查詢操作失敗-----%d",result);
       
    }
    
    //將伴隨指針所持有的資源釋放掉,關閉數(shù)據(jù)庫
    sqlite3_finalize(stmt);
    sqlite3_close(sqlite);
    //while循環(huán)結束,說明所有的記錄都已經(jīng)獲取完整
    return resultMArray;
    
}

@end

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

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

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

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