時間:2017年06月02日星期五
說明:本文部份內容均來自慕課網。@慕課網:http://www.imooc.com
教學示例源碼:無
我的學習源碼:https://github.com/zccodere/s...ios
SQLite操做git
輕量型關係型數據庫管理系統 嵌入式數據庫 佔用資源低 可移植性強 速度快 SQLite3
SQLite支持的數據類型github
沒有布爾類型,用整數0或1代替 沒有日期、時間類型數據,存儲在TEXT、REAL類型中,一般按字符串處理
SQLite語句sql
建立數據庫數據庫
1.使用sqlite3_open函數打開數據庫 2.使用sqlite3_exec函數執行Create Table語句 3.使用sqlite3_close函數釋放資源
編寫SQLManager類,單例模式生成該類app
+ (SQLManager *)shareManager{ static dispatch_once_t once; dispatch_once(&once,^{ manager = [[self alloc] init]; [manager createDataBaseTableIfNeeded]; }); return manager; }
調用方法函數
// 第一個參數是數據庫文件所在的完整路徑 // 第二個參數是數據庫 DataBase if(sqlite3_open([writetablePath UTF8String], &db) != SQLITE_OK){// SQLITE_OK 表明打開成功 // 失敗 sqlite3_close(db);// 關閉數據庫 NSAssert(NO, @"數據庫打開失敗!"); }else{ // 成功 TODO }
調用方法學習
// 第一個參數是數據庫 db對象 // 第二個參數是SQL語句 // 第三個和第四個分別是回調函數和回調函數傳遞的參數 // 第五個參數是一個錯誤信息 sqlite3_exec(db, [createSQL UTF8String], nil, nil, &err)
調用方法測試
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); } }
查詢數據
調用方法
// 第一個參數是數據庫 db對象 // 第二個參數是SQL語句 // 第三個參數是執行語句的長度,-1是指所有長度 // 第四個參數是語句對象 // 第五個參數是沒有執行的語句部分 NULL if(sqlite3_prepare_v2(db, [querySQL UTF8String], -1, &statement, NULL) == SQLITE_OK){ // 預處理成功 TODO }else{ // 預處理失敗 TODO }
調用方法
// 第一個參數 語句對象 // 第二個參數 參數開始執行的序號 // 第三個參數 咱們要綁定的值 // 第四個參數 綁定的字符串的長度 // 第五個參數 指針 NULL sqlite3_bind_text(statement, 1, [idNum UTF8String], -1, NULL);
調用方法
// 有一個返回值 SQLITE_ROW 常量表明查出來了 if (sqlite3_step(statement) == SQLITE_ROW) { // 查詢成功,有數據 TODO }else{ // 查詢失敗,無數據 TODO }
調用方法
// 提取數據 // 第一個參數 語句對象 // 第二個參數 字段的索引 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; }
修改數據
完整代碼
// 保存數據 - (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; }
步驟總結