一、簡單說明
在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
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