1. 程式人生 > >SQLite模糊查詢

SQLite模糊查詢

一、示例

說明:本文簡單示例了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
複製程式碼

實現效果:

     

二、簡單說明

關於:  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:中%是轉義字元,兩個%才表示一個%。 列印檢視: