1. 程式人生 > >iOS-資料庫-SQLite的增刪改查

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
複製程式碼