1.ios中數據的存儲方式ios
(1)Plist(NSArray\NSDictionary)sql
(2)Preference(偏好設置\NSUserDefaults)數據庫
(3)NSCoding(NSKeyedArchiver\NSkeyedUnarchiver)數組
(4)SQLite3緩存
(5)Core Data數據結構
說明:app
(1)什麼是SQLite?dom
答:SQLite是一款輕型的嵌入式數據庫,安卓和ios開發使用的都是SQLite數據庫函數
(2)特色(優勢)工具
答:1)它佔用資源很是的低,在嵌入式設備中,可能只須要幾百K的內存就夠了
2)它的處理速度比Mysql、PostgreSQL這兩款著名的數據庫都還快
(3)什麼是數據庫
答:數據庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫
(4)數據庫的分類
答:能夠分爲2大種類
關係型數據庫(主流)和對象型數據庫(直接把內存中的對象塞入到數據庫,對比關係型數據庫而言性能不能很好,效率不高)
(5)經常使用關係型數據庫有哪些?
答:PC端:Oracle、MySQL、SQL Server、Access、DB二、Sybase
嵌入式\移動客戶端:SQLite
(6)數據庫是如何存儲數據的?
答:數據庫的存儲結構和excel很像,以表(table)爲單位 。表由多個字段(列、屬性、column)組成,表裏面的每一行數據稱爲記錄
(7)數據庫存儲數據的步驟?
1)新建一張表(table)
2)添加多個字段(column,列,屬性)
3)添加多行記錄(row,record,每行存放多個字段對應的值)
3、Navicat
Navicat是一款著名的數據庫管理軟件,支持大部分主流數據庫(包括SQLite)
1.Navicat的安裝
(1)下載該軟件後,先打開該軟件
(2)把文件拖入到應用程序拷貝
(3)破解版,千萬不要打開app,先打開sn.app
(4)點擊patch,找到應用程序的路徑,點擊open.
(5)點擊Generate,生成註冊碼
(6)點擊activate,選擇文件,open
(7)退出sn,打開安裝文件,完成安裝
四 .Sqlite的基本操做
在iOS中使用SQLite3,首先要添加庫文件libsqlite3.dylib和導入主頭文件。
導入頭文件,可使用庫中的函數(是純C語言的)
2、具體說明
新建一個項目,在項目的主界面中放四個按鈕(分別是,增長、刪除、修改、查詢)。
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 }
打印查看查詢結果:
3、補充
完整代碼:
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
SQLite模糊查詢
1、示例
說明:本文簡單示例了SQLite的模糊查詢
1.新建一個繼承自NSObject的模型
該類中的代碼:
1 // 2 // YYPerson.h 3 // 03-模糊查詢 4 // 5 // Created by apple on 14-7-27. 6 // Copyright (c) 2014年 wendingding. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 11 @interface YYPerson : NSObject 12 @property (nonatomic, assign) int ID; 13 @property (nonatomic, copy) NSString *name; 14 @property (nonatomic, assign) int age; 15 16 @end
2.新建一個工具類,用來管理模型
工具類中的代碼設計以下:
YYPersonTool.h文件
1 // 2 // YYPersonTool.h 3 // 03-模糊查詢 4 // 5 // Created by apple on 14-7-27. 6 // Copyright (c) 2014年 wendingding. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 11 @class YYPerson; 12 @interface YYPersonTool : NSObject 13 /** 14 * 保存一個聯繫人 15 */ 16 + (void)save:( YYPerson*)person; 17 18 /** 19 * 查詢全部的聯繫人 20 */ 21 + (NSArray *)query; 22 + (NSArray *)queryWithCondition:(NSString *)condition; 23 @end
YYPersonTool.m文件
1 // 2 // YYPersonTool.m 3 // 03-模糊查詢 4 // 5 // Created by apple on 14-7-27. 6 // Copyright (c) 2014年 wendingding. All rights reserved. 7 // 8 9 #import "YYPersonTool.h" 10 #import "YYPerson.h" 11 12 #import <sqlite3.h> 13 @interface YYPersonTool () 14 //@property(nonatomic,assign)sqlite3 *db; 15 @end 16 @implementation YYPersonTool 17 18 static sqlite3 *_db; 19 //首先須要有數據庫 20 +(void)initialize 21 { 22 //得到數據庫文件的路徑 23 NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 24 NSString *fileName=[doc stringByAppendingPathComponent:@"person.sqlite"]; 25 //將OC字符串轉換爲c語言的字符串 26 const char *cfileName=fileName.UTF8String; 27 28 //1.打開數據庫文件(若是數據庫文件不存在,那麼該函數會自動建立數據庫文件) 29 int result = sqlite3_open(cfileName, &_db); 30 if (result==SQLITE_OK) { //打開成功 31 NSLog(@"成功打開數據庫"); 32 33 //2.建立表 34 const char *sql="CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT,name text NOT NULL,age integer NOT NULL);"; 35 36 char *errmsg=NULL; 37 result = sqlite3_exec(_db, sql, NULL, NULL, &errmsg); 38 if (result==SQLITE_OK) { 39 NSLog(@"創表成功"); 40 }else 41 { 42 printf("創表失敗---%s",errmsg); 43 } 44 }else 45 { 46 NSLog(@"打開數據庫失敗"); 47 } 48 49 } 50 //保存一條數據 51 +(void)save:(YYPerson *)person 52 { 53 //1.拼接SQL語句 54 55 NSString *sql=[NSString stringWithFormat:@"INSERT INTO t_person (name,age) VALUES ('%@',%d);",person.name,person.age]; 56 57 //2.執行SQL語句 58 char *errmsg=NULL; 59 sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errmsg); 60 if (errmsg) {//若是有錯誤信息 61 NSLog(@"插入數據失敗--%s",errmsg); 62 }else 63 { 64 NSLog(@"插入數據成功"); 65 } 66 67 } 68 69 +(NSArray *)query 70 { 71 return [self queryWithCondition:@""]; 72 } 73 74 //模糊查詢 75 +(NSArray *)queryWithCondition:(NSString *)condition 76 { 77 78 //數組,用來存放全部查詢到的聯繫人 79 NSMutableArray *persons=nil; 80 /* 81 [NSString stringWithFormat:@"SELECT id, name, age FROM t_person WHERE name like '%%%@%%' ORDER BY age ASC;", condition]; 82 NSString *NSsql=[NSString stringWithFormat:@"SELECT id,name,age FROM t_person WHERE name=%@;",condition]; 83 */ 84 NSString *NSsql=[NSString stringWithFormat:@"SELECT id,name,age FROM t_person WHERE name like '%%%@%%' ORDER BY age ASC;",condition]; 85 NSLog(@"%@",NSsql); 86 const char *sql=NSsql.UTF8String; 87 88 sqlite3_stmt *stmt=NULL; 89 90 //進行查詢前的準備工做 91 if (sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL)==SQLITE_OK) {//SQL語句沒有問題 92 NSLog(@"查詢語句沒有問題"); 93 94 persons=[NSMutableArray array]; 95 96 //每調用一次sqlite3_step函數,stmt就會指向下一條記錄 97 while (sqlite3_step(stmt)==SQLITE_ROW) {//找到一條記錄 98 99 //取出數據 100 //(1)取出第0列字段的值(int類型的值) 101 int ID=sqlite3_column_int(stmt, 0); 102 //(2)取出第1列字段的值(text類型的值) 103 const unsigned char *name=sqlite3_column_text(stmt, 1); 104 //(3)取出第2列字段的值(int類型的值) 105 int age=sqlite3_column_int(stmt, 2); 106 107 YYPerson *p=[[YYPerson alloc]init]; 108 p.ID=ID; 109 p.name=[NSString stringWithUTF8String:(const char *)name]; 110 p.age=age; 111 // NSLog(@"%@",p.name); 112 [persons addObject:p]; 113 // NSLog(@"haha%@",persons); 114 } 115 }else 116 { 117 NSLog(@"查詢語句有問題"); 118 } 119 120 //NSLog(@"haha%@",persons); 121 return persons; 122 } 123 @end
3.在storyboard中,刪除原有的控制器,放一個導航控制器和UITableViewController控制器,並關聯
在代碼中,讓主控制器直接繼承自UITableViewController
代碼設計以下:
YYViewController.m文件
1 // 2 // YYViewController.m 3 // 03-模糊查詢 4 // 5 // Created by apple on 14-7-27. 6 // Copyright (c) 2014年 wendingding. All rights reserved. 7 // 8 9 #import "YYViewController.h" 10 #import "YYPerson.h" 11 #import "YYPersonTool.h" 12 13 @interface YYViewController ()<UISearchBarDelegate> 14 15 //添加一個數組,用來保存person 16 @property(nonatomic,strong)NSArray *persons; 17 @end 18 19 @implementation YYViewController 20 21 #pragma mark-懶加載 22 -(NSArray *)persons 23 { 24 if (_persons==nil) { 25 _persons=[YYPersonTool query]; 26 } 27 return _persons; 28 } 29 30 //1.在初始化方法中添加一個搜索框 31 - (void)viewDidLoad 32 { 33 [super viewDidLoad]; 34 35 //設置搜索框 36 UISearchBar *search=[[UISearchBar alloc]init]; 37 search.frame=CGRectMake(0, 0, 300, 44); 38 search.delegate=self; 39 self.navigationItem.titleView=search; 40 } 41 42 //2.設置tableView的數據 43 //設置有多少行數據 44 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 45 { 46 // return 10; 47 return self.persons.count; 48 } 49 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 50 { 51 //1.去緩存中取cll,若沒有則本身建立並標記 52 static NSString *ID=@"ID"; 53 UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:ID]; 54 if (cell==nil) { 55 cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID]; 56 } 57 58 //2.設置每一個cell的數據 59 //先取出數據模型 60 YYPerson *person=self.persons[indexPath.row]; 61 //設置這個cell的姓名(name)和年齡 62 cell.textLabel.text=person.name; 63 cell.detailTextLabel.text=[NSString stringWithFormat:@"年齡 %d",person.age]; 64 //3.返回cell 65 return cell; 66 } 67 68 - (IBAction)add:(UIBarButtonItem *)sender { 69 // 初始化一些假數據 70 NSArray *names = @[@"西門抽血", @"西門抽筋", @"西門抽風", @"西門吹雪", @"東門抽血", @"東門抽筋", @"東門抽風", @"東門吹雪", @"北門抽血", @"北門抽筋", @"南門抽風", @"南門吹雪"]; 71 for (int i = 0; i<20; i++) { 72 YYPerson *p = [[YYPerson alloc] init]; 73 p.name = [NSString stringWithFormat:@"%@-%d", names[arc4random_uniform(names.count)], arc4random_uniform(100)]; 74 p.age = arc4random_uniform(20) + 20; 75 [YYPersonTool save:p]; 76 } 77 } 78 79 #pragma mark-搜索框的代理方法 80 -(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 81 { 82 self.persons=[YYPersonTool queryWithCondition:searchText]; 83 //刷新表格 84 [self.tableView reloadData]; 85 [searchBar resignFirstResponder]; 86 } 87 88 @end
實現效果:
2、簡單說明