IOS开发数据库篇—SQLite模糊查询

一、示例

说明:本文简单示例了SQLite的模糊查询

1.新建一个继承自NSObject的模型

该类中的代码:

 //
// 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.新建一个工具类,用来管理模型

工具类中的代码设计如下:

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, -, &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, );
//(2)取出第1列字段的值(text类型的值)
const unsigned char *name=sqlite3_column_text(stmt, );
//(3)取出第2列字段的值(int类型的值)
int age=sqlite3_column_int(stmt, ); 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控制器,并关联

在代码中,让主控制器直接继承自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(, , , );
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 = ; i<; i++) {
YYPerson *p = [[YYPerson alloc] init];
p.name = [NSString stringWithFormat:@"%@-%d", names[arc4random_uniform(names.count)], arc4random_uniform()];
p.age = arc4random_uniform() + ;
[YYPersonTool save:p];
}
} #pragma mark-搜索框的代理方法
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
self.persons=[YYPersonTool queryWithCondition:searchText];
//刷新表格
[self.tableView reloadData];
[searchBar resignFirstResponder];
} @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:中%是转义字符,两个%才表示一个%。
打印查看:

IOS开发数据库篇—SQLite模糊查询的更多相关文章

  1. iOS开发数据库篇—SQLite简单介绍

    iOS开发数据库篇—SQLite简单介绍 一.离线缓存 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等. 说明:离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式 (1 ...

  2. iOS开发数据库篇—SQLite的应用

    iOS开发数据库篇—SQLite的应用 一.简单说明 在iOS中使用SQLite3,首先要添加库文件libsqlite3.dylib和导入主头文件. 导入头文件,可以使用库中的函数(是纯C语言的) 二 ...

  3. iOS开发数据库篇—SQLite常用的函数

    iOS开发数据库篇—SQLite常用的函数 一.简单说明 1.打开数据库 int sqlite3_open( const char *filename,   // 数据库的文件路径 sqlite3 * ...

  4. 【转】 iOS开发数据库篇—SQLite简单介绍

    开始学SQLite啦, 原文: http://www.cnblogs.com/wendingding/p/3868893.html iOS开发数据库篇—SQLite简单介绍 一.离线缓存 在项目开发中 ...

  5. iOS开发数据库篇—SQL

    iOS开发数据库篇—SQL 一.SQL语句 如果要在程序运行过程中操作数据库中的数据,那得先学会使用SQL语句 1.什么是SQL SQL(structured query language):结构化查 ...

  6. iOS开发数据库篇—FMDB简单介绍

    iOS开发数据库篇—FMDB简单介绍 一.简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来 ...

  7. iOS开发数据库篇—FMDB数据库队列

    iOS开发数据库篇—FMDB数据库队列 一.代码示例 1.需要先导入FMDB框架和头文件,由于该框架依赖于libsqlite库,所以还应该导入该库. 2.代码如下: // // YYViewContr ...

  8. iOS开发数据库篇—SQL代码应用示例

    iOS开发数据库篇—SQL代码应用示例 一.使用代码的方式批量添加(导入)数据到数据库中 1.执行SQL语句在数据库中添加一条信息 插入一条数据的sql语句: 点击run执行语句之后,刷新数据 2.在 ...

  9. iOS开发数据库-FMDB

    前言 FMDB是以OC的方式封装了SQLite的C语言API,使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码:对比苹果自带的Core Data框架,更加轻量级和灵活:提供了多线程安全的数据库操 ...

随机推荐

  1. 【iCore3 双核心板_ uC/OS-III】例程五:软件定时器

    实验指导书及代码包下载: http://pan.baidu.com/s/1eSHenjs iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  2. web.xml配置error-page

    一. 通过错误码来配置error-page <error-page> <error-code>404</error-code> <location>/e ...

  3. java FileLock

    import java.nio.ByteBuffer; import java.nio.IntBuffer; import java.nio.channels.FileChannel; import ...

  4. MySQL常用问题解决方法

    Q: # table 损坏 Table 'table_name' is marked as crashed and should be repaired A: 恢复数据表的索引:myisamchk - ...

  5. MySQL- -Join语法解析与性能分析

    Mysql Join语法解析与性能分析 一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ...

  6. prototype

  7. How to prevent SQL injection attacks?

    In our earlier tutorial on SQL Injection, one way to have prevented the SQL injection attack was by ...

  8. 深入Python(4):深拷贝和浅拷贝

    一.前奏:熟悉Python内存管理 在Python中,变量在第一次赋值时自动声明,在创建---也就是赋值的时候,解释器会根据语法和右侧的操作数来决定新对象的类型. 引用计数器:一个内部跟踪变量 引用计 ...

  9. SVD奇异值分解

    奇异值分解 备忘:Eigen类库可能会和其他库产生冲突,将Eigen类库的头文件引用放到前面解决了.

  10. WinForm容器内控件批量效验是否允许为空?设置是否只读?设置是否可用等方法分享

    WinForm容器内控件批量效验是否允许为空?设置是否只读?设置是否可用等方法分享 在WinForm程序中,我们有时需要对某容器内的所有控件做批量操作.如批量判断是否允许为空?批量设置为只读.批量设置 ...