iOS-資料庫-SQLite的增刪改查
一、簡單說明
在iOS中使用SQLite3,首先要新增庫檔案libsqlite3.dylib和匯入主標頭檔案。
匯入標頭檔案,可以使用庫中的函式(是純C語言的)
二、具體說明
新建一個專案,在專案的主介面中放四個按鈕(分別是,增加、刪除、修改、查詢)。
1.sqlite3_open(<#const char *filename#>, <#sqlite3 **ppDb#>)函式的一些說明:
(1)作用:把一個檔名稱傳遞給他,它會自動檢測這個檔案是否存在,如果不存在的話,會自動建立相應的檔案(這裡為資料庫檔案,剛建立為空)。
(2)引數:它的第一個引數為檔案的名稱(需轉換為C語言的),第二個引數是資料庫的例項,sqlite3 *db;
說明:sqlite3是一種型別,db是資料庫的控制代碼,就是資料庫的象徵,如果要進行增刪改查,就得操作db這個例項。
(3)返回值:它的返回值為int型的,根據函式的返回值可以知道,開啟資料庫檔案是成功還是失敗,如果返回值是SQLITE_OK則說明成功,否則為失敗。
2.開啟資料庫
實現程式碼和顯示:
檢視沙盒內建立的資料庫檔案:
雙擊開啟,檢視發現開啟的資料庫連線名稱為students,預設為檔名的字首,資料庫建立成功。
3.建立表
函式說明:
引數:第一個引數為資料庫的控制代碼(db),第二個引數為sql語句,第三個引數為回撥引數,是一個指向函式的指標,如果把callback前面的*改成^則就是一個block程式碼段,第四個引數可以寫NULL,第五個引數為錯誤資訊,用以程式碼除錯。
1 //1.開啟資料庫檔案(如果資料庫檔案不存在,那麼該函式會自動建立資料庫檔案) 2 int result = sqlite3_open(cfileName, &db); 3 if (result==SQLITE_OK) { //開啟成功 4 NSLog(@"成功開啟資料庫"); 5 6 //2.建立表 7 const char *sql="CREATE TABLE IF NOT EXISTS t_students (id integer PRIMARY KEY AUTOINCREMENT,name text NOT NULL,age integer NOT NULL);"; 8 char *errmsg=NULL; 9 result = sqlite3_exec(db, sql, NULL, NULL, &errmsg); 10 if (result==SQLITE_OK) { 11 NSLog(@"創表成功"); 12 }else 13 { 14 NSLog(@"創表失敗----%s",errmsg); 15 } 16 }else 17 { 18 NSLog(@"開啟資料庫失敗"); 19 }
執行後,創表成功,開啟建立的表檢視:
除錯技巧:
1 if (result==SQLITE_OK) { 2 NSLog(@"創表成功"); 3 }else 4 { 5 // NSLog(@"創表失敗----%s",errmsg); 6 printf("創表失敗---%s----%s---%d",errmsg,__FILE__,__LINE__); 7 }
__FILE__巨集列印檔名,
__LINE__巨集列印行號。
4.插入資料
實現程式碼:
1 - (IBAction)insert { 2 for (int i=0; i<20; i++) { 3 //1.拼接SQL語句 4 NSString *name=[NSString stringWithFormat:@"文曉--%d",arc4random_uniform(100)]; 5 int age=arc4random_uniform(20)+10; 6 NSString *sql=[NSString stringWithFormat:@"INSERT INTO t_students (name,age) VALUES ('%@',%d);",name,age]; 7 8 //2.執行SQL語句 9 char *errmsg=NULL; 10 sqlite3_exec(self.db, sql.UTF8String, NULL, NULL, &errmsg); 11 if (errmsg) {//如果有錯誤資訊 12 NSLog(@"插入資料失敗--%s",errmsg); 13 }else 14 { 15 NSLog(@"插入資料成功"); 16 } 17 } 18 }
列印檢視:
檢視資料庫裡t_students表中的資料:
5.選擇(select)查詢操作
函式說明:
select操作也可以使用sqlite3_exec函式實現,但通常使用下面的函式。
引數:第一個引數為資料庫的控制代碼,第二個引數為sql語句,第三個引數為sql的長度(如果設定為-1,則代表系統會自動計算sql語句的長度),第四個引數用來取資料,第五個引數為尾部一般用不上可直接寫NULL。
示例程式碼:
1 - (IBAction)select { 2 const char *sql="SELECT id,name,age FROM t_students WHERE age<20;"; 3 sqlite3_stmt *stmt=NULL; 4 5 //進行查詢前的準備工作 6 if (sqlite3_prepare_v2(self.db, sql, -1, &stmt, NULL)==SQLITE_OK) {//SQL語句沒有問題 7 NSLog(@"查詢語句沒有問題"); 8 9 //每呼叫一次sqlite3_step函式,stmt就會指向下一條記錄 10 while (sqlite3_step(stmt)==SQLITE_ROW) {//找到一條記錄 11 //取出資料 12 //(1)取出第0列欄位的值(int型別的值) 13 int ID=sqlite3_column_int(stmt, 0); 14 //(2)取出第1列欄位的值(text型別的值) 15 const unsigned char *name=sqlite3_column_text(stmt, 1); 16 //(3)取出第2列欄位的值(int型別的值) 17 int age=sqlite3_column_int(stmt, 2); 18 // NSLog(@"%d %s %d",ID,name,age); 19 printf("%d %s %d\n",ID,name,age); 20 } 21 }else 22 { 23 NSLog(@"查詢語句有問題"); 24 } 25 26 }
列印檢視查詢結果:
三、補充
完整程式碼:
YYViewController.m檔案
1 // 2 // YYViewController.m 3 // 02-SQLite的應用 4 // 5 6 #import "YYViewController.h" 7 #import <sqlite3.h> 8 9 @interface YYViewController () 10 //db是資料庫的控制代碼,就是資料庫的象徵,要對資料庫進行增刪改查,就得操作這個例項 11 @property(nonatomic,assign)sqlite3 *db; 12 - (IBAction)insert; 13 - (IBAction)delete; 14 - (IBAction)update; 15 - (IBAction)select; 16 17 @end 18 19 @implementation YYViewController 20 21 - (void)viewDidLoad 22 { 23 [super viewDidLoad]; 24 25 // sqlite3 *db; 26 27 //獲得資料庫檔案的路徑 28 NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 29 NSString *fileName=[doc stringByAppendingPathComponent:@"students.sqlite"]; 30 //將OC字串轉換為c語言的字串 31 const char *cfileName=fileName.UTF8String; 32 33 //1.開啟資料庫檔案(如果資料庫檔案不存在,那麼該函式會自動建立資料庫檔案) 34 int result = sqlite3_open(cfileName, &_db); 35 if (result==SQLITE_OK) { //開啟成功 36 NSLog(@"成功開啟資料庫"); 37 38 //2.建立表 39 const char *sql="CREATE TABLE t_students (id integer PRIMARY KEY AUTOINCREMENT,name text NOT NULL,age integer NOT NULL);"; 40 char *errmsg=NULL; 41 result = sqlite3_exec(self.db, sql, NULL, NULL, &errmsg); 42 if (result==SQLITE_OK) { 43 NSLog(@"創表成功"); 44 }else 45 { 46 // NSLog(@"創表失敗----%s",errmsg); 47 printf("創表失敗---%s----%s---%d",errmsg,__FILE__,__LINE__); 48 } 49 }else 50 { 51 NSLog(@"開啟資料庫失敗"); 52 } 53 } 54 55 - (IBAction)insert { 56 for (int i=0; i<20; i++) { 57 //1.拼接SQL語句 58 NSString *name=[NSString stringWithFormat:@"文曉--%d",arc4random_uniform(100)]; 59 int age=arc4random_uniform(20)+10; 60 NSString *sql=[NSString stringWithFormat:@"INSERT INTO t_students (name,age) VALUES ('%@',%d);",name,age]; 61 62 //2.執行SQL語句 63 char *errmsg=NULL; 64 sqlite3_exec(self.db, sql.UTF8String, NULL, NULL, &errmsg); 65 if (errmsg) {//如果有錯誤資訊 66 NSLog(@"插入資料失敗--%s",errmsg); 67 }else 68 { 69 NSLog(@"插入資料成功"); 70 } 71 } 72 } 73 74 - (IBAction)delete { 75 } 76 77 - (IBAction)updata { 78 } 79 80 - (IBAction)select { 81 const char *sql="SELECT id,name,age FROM t_students WHERE age<20;"; 82 sqlite3_stmt *stmt=NULL; 83 84 //進行查詢前的準備工作 85 if (sqlite3_prepare_v2(self.db, sql, -1, &stmt, NULL)==SQLITE_OK) {//SQL語句沒有問題 86 NSLog(@"查詢語句沒有問題"); 87 88 //每呼叫一次sqlite3_step函式,stmt就會指向下一條記錄 89 while (sqlite3_step(stmt)==SQLITE_ROW) {//找到一條記錄 90 //取出資料 91 //(1)取出第0列欄位的值(int型別的值) 92 int ID=sqlite3_column_int(stmt, 0); 93 //(2)取出第1列欄位的值(text型別的值) 94 const unsigned char *name=sqlite3_column_text(stmt, 1); 95 //(3)取出第2列欄位的值(int型別的值) 96 int age=sqlite3_column_int(stmt, 2); 97 // NSLog(@"%d %s %d",ID,name,age); 98 printf("%d %s %d\n",ID,name,age); 99 } 100 }else 101 { 102 NSLog(@"查詢語句有問題"); 103 } 104 105 } 106 @end