上一篇介紹了coreData的簡單使用,這一次是對SQLite的使用。這二者的不一樣之處就是SQLite須要添加數據庫編寫語句,很麻煩。sql
1、步驟數據庫
使用SQLite數據庫步驟以下:dom
2、代碼實現函數
1 //定義靜態變量 static sqlite3 *_sql; spa
1 //1.打開數據庫 2 //1.1 獲取沙盒中數據庫文件的文件路徑 3 NSString *filePath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/sql.db"]; 4 NSLog(@"%@",filePath); 5 //1.2 執行打開(建立)數據庫的方法 (若是目錄下沒有數據庫文件 會自動建立) 6 /* 7 1.打開數據庫 8 int sqlite3_open( 9 const char *filename, // 數據庫的文件路徑 10 sqlite3 **ppDb // 數據庫實例 11 ); 12 */ 13 int result = sqlite3_open([filePath UTF8String], &_sql); 14 //判斷是否存在,存在就打開,而不是從新建立 15 //result:int 類型 執行打開(建立)數據庫的方法返回的參數 16 //SQLITE_OK = 0 枚舉類型 建立/打開數據庫方法(SQL語句)執行的狀態 17 if (result == SQLITE_OK) { 18 NSLog(@"打開數據庫成功!"); 19 //2.創建表格 20 //初始化SQL語句 21 const char *sql = " create table if not exists t_student (id integer primary key autoincrement, name text, age integer, score real); "; 22 //傳入執行錯誤的參數 23 char *error = NULL; 24 //執行建立表格的方法 25 /* 26 2.執行任何SQL語句 27 int sqlite3_exec( 28 sqlite3*, // 一個打開的數據庫實例 29 const char *sql, // 須要執行的SQL語句 30 int (*callback)(void*,int,char**,char**), // SQL語句執行完畢後的回調 31 void *, // 回調函數的第1個參數 32 char **errmsg // 錯誤信息 33 ); 34 */ 35 int result = sqlite3_exec(_sql, sql, NULL, NULL, &error); 36 if (result == SQLITE_OK) { 37 NSLog(@"建立表格成功!"); 38 }else { 39 NSLog(@"建立表格失敗!"); 40 } 41 }else { 42 NSLog(@"打開數據庫失敗!"); 43 }
當執行完畢這一句代碼的時候就會建立出數據庫--int result = sqlite3_open([filePath UTF8String], &_sql);讀者應該注意註釋部分的解釋,很重要,在這裏不一一贅述。
指針
複製地址,找到文件並打開文件(使用Navicat Premium軟件)code
3、添加數據。orm
在數據庫中循環寫入了5條數據。sqlite
1 //添加數據 2 - (IBAction)insert { 3 int i; 4 for (i = 1; i <= 5; i ++) { 5 int index = i; 6 NSString *name = [NSString stringWithFormat:@"小明%d",index]; 7 //年齡、分數設置爲隨機 8 int age = arc4random()%100; 9 float score = arc4random()%100; 10 //SQL語句 11 NSString *sql = [NSString stringWithFormat:@"insert into t_student (name, age, score) values ('%@', %d, %.2f);\n",name, age, score]; 12 char *error = NULL; 13 // 14 int result = sqlite3_exec(_sql, [sql UTF8String], NULL, NULL, &error); 15 if (result == SQLITE_OK) { 16 NSLog(@"添加數據成功!"); 17 }else { 18 NSLog(@"添加數據失敗!"); 19 } 20 } 21 i = 1; 22 }
4、刪除數據blog
從數據庫中刪除數據,能夠所有刪除,也能夠有選擇行的刪除。
1 //刪除所有數據 2 // NSString *sql = [NSString stringWithFormat:@"delete from t_student;"]; 3 //刪除選擇的數據,須要清楚的知道選擇的數據 4 NSString *sql = [NSString stringWithFormat:@"delete from t_student where name = '小明3'; "]; 5 char *error = NULL; 6 int result = sqlite3_exec(_sql, [sql UTF8String], NULL, NULL, &error); 7 if (result == SQLITE_OK) { 8 NSLog(@"刪除數據成功!"); 9 }else { 10 NSLog(@"刪除數據失敗!"); 11 } 12 }
5、更新數據(修改)
1 //更新數據 2 - (IBAction)upData { 3 NSString *sql = [NSString stringWithFormat:@"update t_student set name = '小虎' where name = '小明1' "]; 4 char *error = NULL; 5 //執行SQL語句 6 int result = sqlite3_exec(_sql, [sql UTF8String], NULL, NULL, &error); 7 if (result == SQLITE_OK) { 8 NSLog(@"更新數據成功!"); 9 }else { 10 NSLog(@"更新數據失敗!"); 11 } 12 }
6、查詢數據
其實,思考一下,不管是修改、刪除都須要查詢數據。
1 //查詢數據 2 - (IBAction)query { 3 //使用佔位符 stmt, 4 NSString *sql = [NSString stringWithFormat:@" select * from t_student where name = ?; "]; 5 //2.定義一個存放集 6 sqlite3_stmt *stmt = nil; 7 //錯誤查詢 8 const char *error = NULL; 9 //3.檢測SQL語句的合法性,並將stmt 和 咱們構造的sql語句進行了綁定,經過stmt能夠填充SQL語句 10 //驗證sql語句是否正確 11 /** 12 *參數1:數據庫指針, 13 *參數2:sql語句 14 *參數3:sql語句的長度寫成-1,自動計算sql語句的最大長度,不然要本身計算長度 15 *參數4:sql語句的管理指針 16 *參數5:預留參數,將來使用 17 */ 18 int result = sqlite3_prepare_v2(_sql, [sql UTF8String], -1, &stmt, &error); 19 if (result == SQLITE_OK) { 20 //參數1:sql語句管理指針 21 //參數2:上面sql語句中 ?的位置,?的下標從1開始 22 //參數3:要綁定的數據 23 //參數4:數據的長度 24 sqlite3_bind_text(stmt, 1, "小明4", -1, NULL); 25 // //綁定字段 26 // sqlite3_bind_int(stmt, 2, 22); 27 // sqlite3_bind_int(stmt, 3, 98); 28 //執行SQL語句 29 int result = sqlite3_step(stmt); 30 31 if (result == SQLITE_ROW) {//若是查詢到某一行數據,就會返回SQLITE_ROW 32 int age = sqlite3_column_int(stmt, 2); 33 NSLog(@"查詢成功"); 34 NSLog(@"%d",age); 35 } 36 } 37 }
1. 檢測SQL語句的合法性,並將stmt 和 咱們構造的sql語句進行了綁定,經過stmt能夠填充SQL語句
sqlite3_prepare_v2(<#sqlite3 *db#>, <#const char *zSql#>, <#int nByte#>, <#sqlite3_stmt **ppStmt#>, <#const char **pzTail#>)
2. 執行SQL語句
sqlite3_exec(<#sqlite3 *#>, <#const char *sql#>, <#int (*callback)(void *, int, char **, char **)#>, <#void *#>, <#char **errmsg#>)
3. 綁定字段
sqlite3_bind_int(<#sqlite3_stmt *#>, <#int#>, <#int#>)
sqlite3_bind_text(<#sqlite3_stmt *#>, <#int#>, <#const char *#>, <#int n#>, <#void (*)(void *)#>)
sqlite3_bind_double(<#sqlite3_stmt *#>, <#int#>, <#double#>)
效果圖以下:
當使用完數據庫以後,要關閉數據庫。這裏沒有關閉。
文章是做者原著,如若轉載,請標明出處。歡迎各位來噴。