UI進階——SQL數據庫

一、IOS開發中支持sqlite3輕量級數據庫

在使用數據庫之前,需要導入數據庫相關的包。


在這裏,我們封裝一個數據庫對象來操作數據庫:

創建單例:

//單例
+(DataBaseHelper *)ShareSingleton{
    
    static DataBaseHelper* dataBaseHelper = nil;
    
    @synchronized(self) {
        if (dataBaseHelper == nil) {
             dataBaseHelper = [[DataBaseHelper alloc]init];
        }
    }
    
    return dataBaseHelper;
}


//創建數據庫路徑
-(void)dataBasePathWithName:(NSString*)fileName{
    
    
    //首先判斷文件是否包含後綴名
    if (![fileName containsString:@".sqlite"]) {
        fileName = [fileName stringByAppendingString:@".sqlite"];
    }
    
    //拼接完整的數據庫路徑
    self.fileName = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:fileName];
}

//創建數據庫
-(sqlite3*)openOrCreateDB{
    
    /*//存儲路徑
    NSString* path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"db.sqlite"];*/
    
    //創建數據庫指針
    sqlite3* sqlite = nil;
    //打開數據庫
    int isOpen = sqlite3_open(self.fileName.UTF8String, &sqlite);
    
    //判斷 是否打開成功
    if (isOpen == SQLITE_OK) {
        NSLog(@"打開成功");
        return sqlite;
    }else{
        NSLog(@"打開失敗");
        return NULL;
    }
}
//執行無返回結果的操作
- (void)execSqlWithSQLString:(NSString*)SQLString message:(NSString*)message{
    
    //打開數據庫
     sqlite3* sqlite = [self openOrCreateDB];
    //執行語句
    int isSuccessful = sqlite3_exec(sqlite, SQLString.UTF8String, NULL, NULL, NULL);
    //執行信息
    if (isSuccessful == SQLITE_OK) {
        NSLog(@"執行成功:%@ is successful",message);
    }else{
        NSLog(@"執行失敗:%@ is fail",message);
    }
    //關閉數據庫
    sqlite3_close(sqlite);
}

//通用的查詢方法
-(NSArray*)querywithSQL:(NSString*)sqlStr{
    
    //打開數據庫
    sqlite3 *sqlite = [self openOrCreateDB];
    
    //聲明stmt指針
    sqlite3_stmt *stament;
    
    //初始化可變數據,用來盛放所有記錄
    NSMutableArray* array = [[NSMutableArray alloc]init];
    
    int result = sqlite3_prepare_v2(sqlite, sqlStr.UTF8String, -1, &stament, NULL);
    
    if (result == SQLITE_OK) {
        
        //遍歷沒一條執行信息,並存儲
        while (sqlite3_step(stament) == SQLITE_ROW) {
            
            //動態獲得記錄的字段數
            int count = sqlite3_column_count(stament);
            //存放數據信息
            NSMutableDictionary *mDic = [[NSMutableDictionary alloc]init];
            for (int i = 0 ; i < count ; i ++) {
                //確定該字段的類型
                int type = sqlite3_column_type(stament, i);
                //確定該字段的關鍵字
                const char *name = sqlite3_column_name(stament, i);
                NSString *key = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];
                //根據類型取值
                switch (type) {
                    case SQLITE_TEXT:
                    {//string
                        NSString* str = [NSString stringWithCString:(const char*)sqlite3_column_text(stament, i) encoding:NSUTF8StringEncoding];
                        [mDic setObject:str forKey:key];
                    }
                    break;
                    case SQLITE_INTEGER:
                    {//int
                        NSInteger value = sqlite3_column_int(stament, i);
                        [mDic setObject:@(value) forKey:key];
                    }
                    break;
                    case SQLITE_BLOB:
                    {
                        
                    }
                    break;
                        
                    default:
                        break;
                }
            }
            //將記錄添加到數組-
            [array addObject:mDic];
        }
        //關閉數據庫,釋放資源
        sqlite3_close(sqlite);
        //釋放指針
        sqlite3_finalize(stament);
        //返回該值
        return array;
    }else{
        NSLog(@"查詢語句有問題");
        //關閉數據庫,釋放資源
        sqlite3_close(sqlite);
        //釋放指針
        sqlite3_finalize(stament);
        return  array;
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章