慕課網_《iOS基礎教程-SQLite數據庫操做》學習總結

時間:2017年06月02日星期五
說明:本文部份內容均來自慕課網。@慕課網:http://www.imooc.com
教學示例源碼:無
我的學習源碼:https://github.com/zccodere/s...ios

第一章:學習指南

1-1 課程介紹

SQLite操做git

輕量型關係型數據庫管理系統
嵌入式數據庫
佔用資源低
可移植性強
速度快
SQLite3

第二章:數據類型和指令

2-1 數據類型及指令

SQLite支持的數據類型github

沒有布爾類型,用整數0或1代替
沒有日期、時間類型數據,存儲在TEXT、REAL類型中,一般按字符串處理

clipboard.png

SQLite語句sql

clipboard.png

第三章:操做數據庫

3-1 打開數據庫一

建立數據庫數據庫

1.使用sqlite3_open函數打開數據庫
2.使用sqlite3_exec函數執行Create Table語句
3.使用sqlite3_close函數釋放資源

3-2 打開數據庫二

編寫SQLManager類,單例模式生成該類app

+ (SQLManager *)shareManager{
    static dispatch_once_t once;
    dispatch_once(&once,^{
        manager = [[self alloc] init];
        [manager createDataBaseTableIfNeeded];
    });
    return manager;
}

3-3 打開數據庫三

調用方法函數

// 第一個參數是數據庫文件所在的完整路徑
// 第二個參數是數據庫 DataBase
if(sqlite3_open([writetablePath UTF8String], &db) != SQLITE_OK){// SQLITE_OK 表明打開成功
    // 失敗
    sqlite3_close(db);// 關閉數據庫
    NSAssert(NO, @"數據庫打開失敗!");
}else{
    // 成功 TODO
}

3-4 執行語句

調用方法學習

// 第一個參數是數據庫 db對象
// 第二個參數是SQL語句
// 第三個和第四個分別是回調函數和回調函數傳遞的參數
// 第五個參數是一個錯誤信息
sqlite3_exec(db, [createSQL UTF8String], nil, nil, &err)

3-5 關閉數據庫

調用方法測試

sqlite3_close(db);

本章完整代碼spa

// 獲取數據庫路徑
- (NSString *)applicationDocumentsDirectoryFile{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentDirectory = [paths firstObject];
    NSString *filePath = [documentDirectory stringByAppendingPathComponent:kNameFile];
    return filePath;
}

// 建立數據庫
- (void)createDataBaseTableIfNeeded {
    NSString *writetablePath = [self applicationDocumentsDirectoryFile];
    NSLog(@"數據庫的地址是:%@",writetablePath);
    
    // 第一個參數是數據庫文件所在的完整路徑
    // 第二個參數是數據庫 DataBase
    if(sqlite3_open([writetablePath UTF8String], &db) != SQLITE_OK){// SQLITE_OK 表明打開成功
        // 失敗
        sqlite3_close(db);// 關閉數據庫
        NSAssert(NO, @"數據庫打開失敗!");
    }else{
        char *err;
        NSString *createSQL = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS StudentName (idNum TEXT PRIMARY KEY,name TEXT);"];
        // 第一個參數是數據庫 db對象
        // 第二個參數是SQL語句
        // 第三個和第四個分別是回調函數和回調函數傳遞的參數
        // 第五個參數是一個錯誤信息
        if(sqlite3_exec(db, [createSQL UTF8String], nil, nil, &err) != SQLITE_OK){
            // 失敗
            sqlite3_close(db);// 關閉數據庫
            NSAssert(NO, @"建表失敗!");
        }
        sqlite3_close(db);
    }
}

第四章:預處理和綁定

4-1 預處理

查詢數據

clipboard.png

調用方法

// 第一個參數是數據庫 db對象
// 第二個參數是SQL語句
// 第三個參數是執行語句的長度,-1是指所有長度
// 第四個參數是語句對象
// 第五個參數是沒有執行的語句部分 NULL
if(sqlite3_prepare_v2(db, [querySQL UTF8String], -1, &statement, NULL) == SQLITE_OK){
    // 預處理成功 TODO
}else{
    // 預處理失敗 TODO
}

4-2 綁定

調用方法

// 第一個參數 語句對象
// 第二個參數 參數開始執行的序號
// 第三個參數 咱們要綁定的值
// 第四個參數 綁定的字符串的長度
// 第五個參數 指針 NULL
sqlite3_bind_text(statement, 1, [idNum UTF8String], -1, NULL);

4-3 遍歷過程

調用方法

// 有一個返回值 SQLITE_ROW 常量表明查出來了
if (sqlite3_step(statement) == SQLITE_ROW) {
    // 查詢成功,有數據 TODO
}else{
    // 查詢失敗,無數據 TODO
}

4-4 提取數據

調用方法

// 提取數據
// 第一個參數 語句對象
// 第二個參數 字段的索引
char *idNum = (char *)sqlite3_column_text(statement, 0);

本章完整代碼

// 查詢
- (StudentModel *)searchWithIdNum:(StudentModel *)model{
    
    NSString *path = [self applicationDocumentsDirectoryFile];
    
    if(sqlite3_open([path UTF8String], &db) != SQLITE_OK){// SQLITE_OK 表明打開成功
        // 失敗
        sqlite3_close(db);// 關閉數據庫
        NSAssert(NO, @"數據庫打開失敗!");
    }else{
        NSString *querySQL = @"SELECT idNum,name FROM StudentName where idNum = ?";
        sqlite3_stmt *statement;//語句對象
        
        // 第一個參數是數據庫 db對象
        // 第二個參數是SQL語句
        // 第三個參數是執行語句的長度,-1是指所有長度
        // 第四個參數是語句對象
        // 第五個參數是沒有執行的語句部分 NULL
        if(sqlite3_prepare_v2(db, [querySQL UTF8String], -1, &statement, NULL) == SQLITE_OK){
            // 進行 按主鍵查詢數據庫
            NSString *idNum = model.idNum;
            // 第一個參數 語句對象
            // 第二個參數 參數開始執行的序號
            // 第三個參數 咱們要綁定的值
            // 第四個參數 綁定的字符串的長度
            // 第五個參數 指針 NULL
            sqlite3_bind_text(statement, 1, [idNum UTF8String], -1, NULL);
            
            // 有一個返回值 SQLITE_ROW 常量表明查出來了
            if (sqlite3_step(statement) == SQLITE_ROW) {
                // 提取數據
                // 第一個參數 語句對象
                // 第二個參數 字段的索引
                char *idNum = (char *)sqlite3_column_text(statement, 0);
                // 數據轉換
                NSString *idNumStr = [[NSString alloc] initWithUTF8String:idNum];
                
                char *name = (char *)sqlite3_column_text(statement, 1);
                NSString *nameStr = [[NSString alloc] initWithUTF8String:name];
                
                StudentModel *respModel = [[StudentModel alloc] init];
                respModel.idNum = idNumStr;
                respModel.name = nameStr;
                
                sqlite3_finalize(statement);
                sqlite3_close(db);
                
                NSLog(@"數據查詢成功!idNum=%@",model.idNum);
                
                return respModel;
            }
        }
        sqlite3_finalize(statement);
        sqlite3_close(db);
    }
    
    NSLog(@"數據查詢失敗!idNum=%@",model.idNum);
    StudentModel *respModel = [[StudentModel alloc] init];
    respModel.idNum = @"200";
    respModel.name = @"測試2";
    return respModel;
}

第五章:修改數據庫

5-1 綁定過程

修改數據

clipboard.png

5-2 修改數據庫

完整代碼

// 保存數據
- (int)insert:(StudentModel *)model{
    NSString *path = [self applicationDocumentsDirectoryFile];
    
    if(sqlite3_open([path UTF8String], &db) != SQLITE_OK){// SQLITE_OK 表明打開成功
        // 失敗
        sqlite3_close(db);// 關閉數據庫
        NSAssert(NO, @"數據庫打開失敗!");
    }else{
        // 編寫SQL語句
        NSString *insertSQL = @"INSERT OR REPLACE INTO StudentName (idNum,name) VALUES (?,?)";
        // 定義預編譯語句
        sqlite3_stmt *statement;
        
        // 進行預處理
        if(sqlite3_prepare_v2(db, [insertSQL UTF8String], -1, &statement, NULL) == SQLITE_OK){
            // 進行參數綁定
            sqlite3_bind_text(statement, 1, [model.idNum UTF8String], -1, NULL);
            sqlite3_bind_text(statement, 2, [model.name UTF8String], -1, NULL);
            
            // 執行預處理語句
            if (sqlite3_step(statement) != SQLITE_DONE) {
                // 操做未完成
                NSAssert(NO, @"保存數據失敗!");
            }
            
            NSLog(@"數據保存成功!idNum=%@,name=%@",model.idNum,model.name);
            
            sqlite3_finalize(statement);
            sqlite3_close(db);
        }
    }
    return 0;
}

第六章:總結

6-1 總結

步驟總結

clipboard.png

相關文章
相關標籤/搜索