1. 程式人生 > >IOS 資料庫篇5—SQLite模糊查詢

IOS 資料庫篇5—SQLite模糊查詢

一、示例

說明:本文簡單示例了SQLite的模糊查詢

1.新建一個繼承自NSObject的模型

image

該類中的程式碼:

//
//  YYPerson.h
//  03-模糊查詢
//
//  Created by apple on 14-7-27.
//  Copyright (c) 2014年 wendingding. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface YYPerson : NSObject
@property (nonatomic, assign) int ID;
@property (nonatomic
, copy) NSString *name; @property (nonatomic, assign) int age; @end

2.新建一個工具類,用來管理模型

image

工具類中的程式碼設計如下:

YYPersonTool.h檔案

//
//  YYPersonTool.h
//  03-模糊查詢
//
//  Created by apple on 14-7-27.
//  Copyright (c) 2014年 wendingding. All rights reserved.
//

#import <Foundation/Foundation.h>

@class YYPerson;
@interface
YYPersonTool : NSObject /** * 儲存一個聯絡人 */ + (void)save:( YYPerson*)person; /** * 查詢所有的聯絡人 */ + (NSArray *)query; + (NSArray *)queryWithCondition:(NSString *)condition; @end

YYPersonTool.m檔案

//
//  YYPersonTool.m
//  03-模糊查詢
//
//  Created by apple on 14-7-27.
//  Copyright (c) 2014年 wendingding. All rights reserved.
// #import "YYPersonTool.h" #import "YYPerson.h" #import <sqlite3.h> @interface YYPersonTool () //@property(nonatomic,assign)sqlite3 *db; @end @implementation YYPersonTool static sqlite3 *_db; //首先需要有資料庫 +(void)initialize { //獲得資料庫檔案的路徑 NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *fileName=[doc stringByAppendingPathComponent:@"person.sqlite"]; //將OC字串轉換為c語言的字串 const char *cfileName=fileName.UTF8String; //1.開啟資料庫檔案(如果資料庫檔案不存在,那麼該函式會自動建立資料庫檔案) int result = sqlite3_open(cfileName, &_db); if (result==SQLITE_OK) { //開啟成功 NSLog(@"成功開啟資料庫"); //2.建立表 const char *sql="CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT,name text NOT NULL,age integer NOT NULL);"; char *errmsg=NULL; result = sqlite3_exec(_db, sql, NULL, NULL, &errmsg); if (result==SQLITE_OK) { NSLog(@"創表成功"); }else { printf("創表失敗---%s",errmsg); } }else { NSLog(@"開啟資料庫失敗"); } } //儲存一條資料 +(void)save:(YYPerson *)person { //1.拼接SQL語句 NSString *sql=[NSString stringWithFormat:@"INSERT INTO t_person (name,age) VALUES ('%@',%d);",person.name,person.age]; //2.執行SQL語句 char *errmsg=NULL; sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errmsg); if (errmsg) {//如果有錯誤資訊 NSLog(@"插入資料失敗--%s",errmsg); }else { NSLog(@"插入資料成功"); } } +(NSArray *)query { return [self queryWithCondition:@""]; } //模糊查詢 +(NSArray *)queryWithCondition:(NSString *)condition { //陣列,用來存放所有查詢到的聯絡人 NSMutableArray *persons=nil; /* [NSString stringWithFormat:@"SELECT id, name, age FROM t_person WHERE name like '%%%@%%' ORDER BY age ASC;", condition]; NSString *NSsql=[NSString stringWithFormat:@"SELECT id,name,age FROM t_person WHERE name=%@;",condition]; */ NSString *NSsql=[NSString stringWithFormat:@"SELECT id,name,age FROM t_person WHERE name like '%%%@%%' ORDER BY age ASC;",condition]; NSLog(@"%@",NSsql); const char *sql=NSsql.UTF8String; sqlite3_stmt *stmt=NULL; //進行查詢前的準備工作 if (sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL)==SQLITE_OK) {//SQL語句沒有問題 NSLog(@"查詢語句沒有問題"); persons=[NSMutableArray array]; //每呼叫一次sqlite3_step函式,stmt就會指向下一條記錄 while (sqlite3_step(stmt)==SQLITE_ROW) {//找到一條記錄 //取出資料 //(1)取出第0列欄位的值(int型別的值) int ID=sqlite3_column_int(stmt, 0); //(2)取出第1列欄位的值(text型別的值) const unsigned char *name=sqlite3_column_text(stmt, 1); //(3)取出第2列欄位的值(int型別的值) int age=sqlite3_column_int(stmt, 2); YYPerson *p=[[YYPerson alloc]init]; p.ID=ID; p.name=[NSString stringWithUTF8String:(const char *)name]; p.age=age; // NSLog(@"%@",p.name); [persons addObject:p]; // NSLog(@"haha%@",persons); } }else { NSLog(@"查詢語句有問題"); } //NSLog(@"haha%@",persons); return persons; } @end

3.在storyboard中,刪除原有的控制器,放一個導航控制器和UITableViewController控制器,並關聯

image

在程式碼中,讓主控制器直接繼承自UITableViewController

程式碼設計如下:

YYViewController.m檔案

//
//  YYViewController.m
//  03-模糊查詢
//
//  Created by apple on 14-7-27.
//  Copyright (c) 2014年 wendingding. All rights reserved.
//

#import "YYViewController.h"
#import "YYPerson.h"
#import "YYPersonTool.h"

@interface YYViewController ()<UISearchBarDelegate>

//新增一個數組,用來儲存person
@property(nonatomic,strong)NSArray *persons;
@end

@implementation YYViewController

#pragma mark-懶載入
-(NSArray *)persons
{
    if (_persons==nil) {
        _persons=[YYPersonTool query];
    }
    return _persons;
}

//1.在初始化方法中新增一個搜尋框
- (void)viewDidLoad
{
    [super viewDidLoad];

    //設定搜尋框
    UISearchBar *search=[[UISearchBar alloc]init];
    search.frame=CGRectMake(0, 0, 300, 44);
    search.delegate=self;
    self.navigationItem.titleView=search;
}

//2.設定tableView的資料
//設定有多少行資料
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
//    return 10;
    return self.persons.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //1.去快取中取cll,若沒有則自己建立並標記
    static NSString *ID=@"ID";
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:ID];
    if (cell==nil) {
        cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
    }

    //2.設定每個cell的資料
    //先取出資料模型
    YYPerson *person=self.persons[indexPath.row];
    //設定這個cell的姓名(name)和年齡
    cell.textLabel.text=person.name;
    cell.detailTextLabel.text=[NSString stringWithFormat:@"年齡  %d",person.age];
    //3.返回cell
    return cell;
}

- (IBAction)add:(UIBarButtonItem *)sender {
    // 初始化一些假資料
    NSArray *names = @[@"西門抽血", @"西門抽筋", @"西門抽風", @"西門吹雪", @"東門抽血", @"東門抽筋", @"東門抽風", @"東門吹雪", @"北門抽血", @"北門抽筋", @"南門抽風", @"南門吹雪"];
    for (int i = 0; i<20; i++) {
        YYPerson *p = [[YYPerson alloc] init];
        p.name = [NSString stringWithFormat:@"%@-%d", names[arc4random_uniform(names.count)], arc4random_uniform(100)];
        p.age = arc4random_uniform(20) + 20;
        [YYPersonTool save:p];
    }
}

#pragma mark-搜尋框的代理方法
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    self.persons=[YYPersonTool queryWithCondition:searchText];
    //重新整理表格
    [self.tableView reloadData];
    [searchBar resignFirstResponder];
}

@end

實現效果:

image  

image

二、簡單說明

關於:

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

列印檢視:
image