iOS中 DataBase SQL資料庫 UI_進階
SQL(Structured query Lauguage) :結構化 查詢 語言
1.建立表格的SQL語句 create table if not exists Teacher(tea_id integer primary key autoincrement,tea_name text,tea_gender text,tea_age integer,tea_salary integer) 增: 2.向表中的欄位下插入資料 insert into Teacher(tea_id,tea_name,tea_gender,tea_age,tea_salary)values(110,'小韓哥','男',18,1000) 查: 3.尋找表格中所有的內容( * 查詢老師表格中所有的資料) select * from Teacher 4.尋找表格中對應欄位的所有資訊( tea_name和tea_gender 下的所有資料) select tea_name,tea_gender from Teacher 5.根據條件為’小韓哥’尋找其資訊 select *from Teacher where tea_name = '小韓哥' 改: 6.根據唯一標示符(主鍵)修改老師性別的資訊 改資料都要通過唯一標示符去改 update Teacher set tea_gender = '女' where tea_id = 111 刪: 7.根據唯一標示符(主鍵)刪除老師性別的資訊 刪除資料都要通過唯一標示符去改 delete from Teacher where tea_id = 110 8.刪除表格中所有的資料 delete from Teacher 9.根據表名刪除整個表格 drop table Teacher —————————————————————————————————————————————————— 下面通過實際例子對資料庫進行增、刪、改、查: 布局如下(不再進行代碼布局):4個textField 5個Button
———————————————————————————————————————— 準備一個Student的model類:
Student.h@interface Student : NSObject@property(nonatomic,assign)NSInteger number;@property(nonatomic,copy)NSString *name;@property(nonatomic,copy)NSString *gender;@property(nonatomic,assign)NSInteger age;@endStudent.m@implementation Student- (void)dealloc{ self.name = nil; self.gender = nil; [super dealloc];}- (NSString *)description{ return [NSString stringWithFormat:@%ld %@ %@ %ld, self.number,self.name,self.gender,self.age];}@end
通過單例寫介面並實現方法:
DataBaseHandle.h@class Student;@interface DataBaseHandle : NSObject//建立單例的方法+ (DataBaseHandle *)shareDataBaseHandle;//開啟資料庫的方法- (void)openDataBase;//關閉資料庫的方法- (void)closeDataBase;//插入學生對象的介面- (void)insertStudent : (Student *)student;//返回表格中所有學生的介面- (NSMutableArray *)selectAllStudent;//根據唯一標識學號刪除學生- (void)deleteOneStudentByNumber : (NSInteger )number;//根據唯一標識學號修改學生的姓名- (void)updateStudentGender : (NSString *)gender ByNumber : (NSInteger )number;//根據學號尋找學生- (Student *)selectOneStudentByNumber : (NSInteger)number;@end
DataBaseHandle.m
#import DataBaseHandle.h#import #import Student.h@implementation DataBaseHandlestatic DataBaseHandle *handle = nil;//建立單例的方法+ (DataBaseHandle *)shareDataBaseHandle{ @synchronized(self){ if (handle == nil) { handle = [[DataBaseHandle alloc]init]; //讓單例對象一建立後就可以訪問資料庫 [handle openDataBase]; } } return handle;}//返回資料庫路徑- (NSString *)dataBasePath{ //將資料庫檔案放到Documents檔案夾下 student.sqlite return [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@student.sqlite];}
定義一個全域且在靜態區的資料庫指標
static sqlite3 *db = nil;
開啟資料庫的方法
- (void)openDataBase{ //1.先擷取資料檔案的路徑 NSString *dbPath = [self dataBasePath]; //使用sql之前一定要匯入libsqlite3.0動態連結類庫,其中libsqlite.3.0是捷徑,匯入捷徑的好處,當版本更新的時候,不再匯入新的實體類庫了,因為捷徑永遠指向的是最新的實體類庫(記得匯入標頭檔) //2.使用sql語句開啟資料庫
//[dbPath UTF8String] 將OC字串轉化為C語言字串 //sqlite3 就是資料庫指標 //建立資料庫指標db// sqlite3 *db = nil; //方法執行完,內不會對資料庫指標db進行初始化,方法執行完,就會存在資料庫檔案 //此方法會先檢測檔案路徑中有沒有對應的資料庫檔案,沒有則建立,有的話直接開啟 int result = sqlite3_open([dbPath UTF8String], &db); //SQLITE_OK 說明sql是成功 if (result == SQLITE_OK) {// NSLog(@資料庫開啟成功); //建立表格 //準備sql語句 NSString *sqlString = @create table if not exists Student(stu_number integer primary key autoincrement,stu_name text,stu_gender text,stu_age integer); //執行sql語句 sqlite3_exec(db, [sqlString UTF8String], NULL, NULL, NULL); }else{ NSLog(@資料庫開啟失敗); } }
關閉資料庫的方法
- (void)closeDataBase{int result = sqlite3_close(db); NSLog(@%@,(result == SQLITE_OK) ? @關閉成功:@關閉失敗);}
插入學生對象的介面——增
- (void)insertStudent : (Student *)student{ //1.開啟資料庫 [self openDataBase]; //2.準備插入的sql語句 NSString *sqlString = @insert into Student(stu_name,stu_gender,stu_age)values(?,?,?); //3.建立資料庫管理指標(資料庫管理指令集) sqlite3_stmt *stmt = nil; //4.驗證sql語句是否正確 //參數1:資料庫指標, //參數2:sql語句 //參數3:sql語句的長度寫成-1,自動計算sql語句的最大長度,否則要自己計算長度 //參數4:sql語句的管理指標 //參數5:預留參數,未來使用 //5.拿驗證的結果,判斷是否執行參數綁定的操作 int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL); if (result == SQLITE_OK) { NSLog(@插入成功); //參數1:sql語句管理指標 //參數2:上面sql語句中 ?的位置,?的下標從1開始 //參數3:要繫結資料 //參數4:資料的長度 //綁定欄位stu_name 的資料 sqlite3_bind_text(stmt, 1, [student.name UTF8String], -1, NULL); //綁定欄位stu_gender 的資料 sqlite3_bind_text(stmt, 2, [student.gender UTF8String], -1, NULL); //綁定欄位stu_age 的資料 sqlite3_bind_int(stmt, 3, (int)student.age); //6.讓sql語句執行 sqlite3_step(stmt); } //7.釋放掉管理指標 sqlite3_finalize(stmt); //8.關閉資料庫 [self closeDataBase];}
返回表格中所有學生的介面——查1
- (NSMutableArray *)selectAllStudent{ //1.開啟資料庫 [self openDataBase]; //2.準備sql語句 NSString *sqlString = @select * from Student; //3.建立管家指標 sqlite3_stmt *stmt = nil; //4.驗證sql語句是否正確int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL); if (SQLITE_OK == result) { NSLog(@尋找全部語句成功); //建立可變數組儲存找到所有的學生對象 NSMutableArray *array = [NSMutableArray arrayWithCapacity:0]; //SQLITE_ROW 如果等於row說明下一行是有資料的,迴圈繼續,如果不等於SQLITE_ROW ,說明下一行沒有資料了,迴圈結束 while (sqlite3_step(stmt) == SQLITE_ROW) { //依次讀出欄位的資料 //列的編號是從零開始的 //第一列 int number = sqlite3_column_int(stmt, 0); //第二列 NSString *name = [NSString stringWithUTF8String:(const char *) sqlite3_column_text(stmt, 1) ]; //第三列 NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)]; //第四列 int age = sqlite3_column_int(stmt, 3); //5.建立學生對象並賦值 Student *stu = [[Student alloc]init]; stu.number = number; stu.name = name; stu.gender = gender; stu.age = age; //添加到數組 [array addObject:stu]; //釋放 [stu release]; } //6.釋放管理指標 sqlite3_finalize(stmt); //關閉資料庫 [self closeDataBase]; return array; }else{ sqlite3_finalize(stmt); [self closeDataBase]; return nil; } }
根據學號尋找學生——查2
- (Student *)selectOneStudentByNumber : (NSInteger)number{ //1.開啟資料庫 [self openDataBase]; //2.準備sql語句 NSString *sqlString = @select * from Student where stu_number = ?; //3.建立管理指標 sqlite3_stmt *stmt = nil; //4.驗證sql語句是否正確 int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL); //5.根據驗證結果決定執行什麼操作 if (result == SQLITE_OK) { //6.綁定參數 sqlite3_bind_int(stmt, 1, (int)number); //7.遍曆表格中的資料 //建立model學生Object Storage Service找到的學生資訊 Student *stu = [[Student alloc]init]; while (sqlite3_step(stmt) == SQLITE_ROW) { //根據找到的資料給學生的屬性賦值 stu.number = number; stu.name =[NSString stringWithUTF8String:(const char *) sqlite3_column_text(stmt, 1)]; stu.gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)]; stu.age = sqlite3_column_int(stmt, 3); } //8.釋放管理指標 sqlite3_finalize(stmt); //9.關閉資料庫 [self closeDataBase]; return [stu autorelease]; }else{ //10.釋放管理指標 sqlite3_finalize(stmt); //11.關閉資料庫 [self closeDataBase]; } return nil;}
根據唯一標識學號刪除學生——刪
- (void)deleteOneStudentByNumber : (NSInteger )number{ //1.開啟資料庫 [self openDataBase]; //2.準備刪除sql語句 NSString *sqlString = @delete from Student where stu_number = ?; //3.建立資料庫管理指標 sqlite3_stmt *stmt = nil; //4.驗證sql語句是否正確 int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL); //5.判斷是否執行參數綁定的操作 if (result == SQLITE_OK) { //6.綁定傳過來的參數 sqlite3_bind_int(stmt, 1, (int)number); //7.執行sql語句 sqlite3_step(stmt); } //8.釋放掉管理指標 sqlite3_finalize(stmt); //9.關閉資料庫 [self closeDataBase]; }
根據唯一標識學號修改學生的姓名——改
- (void)updateStudentGender : (NSString *)gender ByNumber : (NSInteger )number{ //1.開啟資料庫 [self openDataBase]; //2.準備sql語句 NSString *sqlString = @update Student set stu_gender = ? where stu_number = ?; //3.建立資料庫管理指標 sqlite3_stmt *stmt = nil; //4.驗證sql語句 int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL); //5.根據驗證的結果決定執行的操作 if (result == SQLITE_OK) { //6.綁定參數 sqlite3_bind_text(stmt, 1, [gender UTF8String], -1, NULL); //7.綁定學號 //第二個參數:是 ? 在sql語句中位置,位置從1開始 sqlite3_bind_int(stmt, 2, (int)number); //8.執行sql語句 sqlite3_step(stmt); } //9.釋放管理指標 sqlite3_finalize(stmt); //10.關閉資料庫 [self closeDataBase]; }
方法的調用:
ViewController.m
#import ViewController.h#import DataBaseHandle.h#import Student.h@interface ViewController ()@property (retain, nonatomic) IBOutlet UITextField *numberField;//學號@property (retain, nonatomic) IBOutlet UITextField *nameField;//姓名@property (retain, nonatomic) IBOutlet UITextField *genderField;//性別@property (retain, nonatomic) IBOutlet UITextField *ageField;//年齡@end
1、添加:增
- (IBAction)insertStudent:(UIButton *)sender { //判斷有一個控制項中輸入的內容為空白,就不讓它插入資料 if (0 == self.nameField.text.length || 0 == self.genderField.text.length || 0 == self.ageField.text.length) { return; } //建立學生Student 對象,儲存空間中輸入的內容 Student *stu = [[Student alloc]init]; stu.name = self.nameField.text; stu.gender = self.genderField.text; stu.age = [self.ageField.text integerValue]; [[DataBaseHandle shareDataBaseHandle]insertStudent:stu]; [stu release]; }
2、更新學生資訊:改
- (IBAction)updateStudent:(UIButton *)sender { //擷取輸入框的內容 NSInteger number = [self.numberField.text integerValue]; NSString *gender = self.genderField.text; //調用根據學號修改gender的方法 [[DataBaseHandle shareDataBaseHandle]updateStudentGender:gender ByNumber:number];}
3、刪除學生:刪
- (IBAction)deleteStudent:(UIButton *)sender { NSInteger number = [self.numberField.text integerValue]; //調用根據學號刪除學生的方法 [[DataBaseHandle shareDataBaseHandle]deleteOneStudentByNumber:number];}
4、尋找全部學生:查1
- (IBAction)selectAllStudent:(UIButton *)sender { //調用尋找所有學生 NSMutableArray *contentArray = [[DataBaseHandle shareDataBaseHandle]selectAllStudent]; for (Student *stu in contentArray) { NSLog(@%@,stu); } }
5、尋找某個學生:查2
- (IBAction)selectOneStudent:(id)sender { //擷取學號輸入框的內容 NSInteger number = [self.numberField.text integerValue]; //調用根據學號擷取學生對象 Student *stu = [[DataBaseHandle shareDataBaseHandle]selectOneStudentByNumber:number]; NSLog(@%@,stu);}
記得釋放:
- (void)dealloc { [_numberField release]; [_nameField release]; [_genderField release]; [_ageField release]; [super dealloc];}
總結:一般步驟:1、開啟資料庫;2、準備sql語句;3、建立管家指標;4、驗證sql語句是否正確;5、根據驗證結果決定執行什麼操作;6、綁定參數;7、遍曆表格中的資料(根據學號尋找學生);8、釋放管理指標;9、關閉資料庫