iOS-數據持久化-SQlite3

SQLite3簡單介紹

1.ios中數據的存儲方式ios

(1)Plist(NSArray\NSDictionary)sql

(2)Preference(偏好設置\NSUserDefaults)數據庫

(3)NSCoding(NSKeyedArchiver\NSkeyedUnarchiver)數組

(4)SQLite3緩存

(5)Core Data數據結構

說明:app

3是版本號,是SQLite的第三個版本。
core Data是對SQLite的封裝,由於iOS中使用的SQLite是純C語言的。
2.SQLite

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

關於:  NSString *NSsql=[NSString stringWithFormat:@"SELECT id,name,age FROM t_person WHERE name like '%%%@%%' ORDER BY age ASC;",condition];
 
注意:name like ‘西門’,至關因而name = ‘西門’。
name like ‘%西%’,爲模糊搜索,搜索字符串中間包含了’西’,左邊能夠爲任意字符串,右邊能夠爲任意字符串,的字符串。
可是在 stringWithFormat:中%是轉義字符,兩個%才表示一個%。
打印查看:
相關文章
相關標籤/搜索