简介iOS开发中应用SQLite的模糊查询和常用函数

海南护肤

海南护肤

2016-02-19 10:32

人生本是一个不断学习的过程,在这个过程中,图老师就是你们的好帮手,下面分享的简介iOS开发中应用SQLite的模糊查询和常用函数懂设计的网友们快点来了解吧!

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(@"打开数据库失败");
    }

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

}
//保存一条数据
+(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控制器,并关联

在代码中,让主控制器直接继承自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; i20; 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

实现效果:

二、简单说明

关于:  NSString *NSsql=[NSString stringWithFormat:@"SELECT id,name,age FROM t_person WHERE name like '%%%@%%' ORDER BY age ASC;",condition];
 
注意:name like ‘西门',相当于是name = ‘西门'。
name like ‘%西%',为模二、简单说明

关于:  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:中%是转义字符,两个%才表示一个%。
打印查看:糊搜索,搜索字符串中间包含了'西',左边可以为任意字符串,右边可以为任意字符串,的字符串。
但是在 stringWithFormat:中%是转义字符,两个%才表示一个%。

SQLite常用的函数
一、简单说明

1.打开数据库
代码如下:

int sqlite3_open(

    const char *filename,   // 数据库的文件路径

    sqlite3 **ppDb          // 数据库实例

);

 

2.执行任何SQL语句
代码如下:

int sqlite3_exec(

    sqlite3*,                                  // 一个打开的数据库实例

    const char *sql,                           // 需要执行的SQL语句

    int (*callback)(void*,int,char**,char**),  // SQL语句执行完毕后的回调

    void *,                                    // 回调函数的第1个参数

    char **errmsg                              // 错误信息

);

 

3.检查SQL语句的合法性(查询前的准备)
代码如下:

int sqlite3_prepare_v2(

    sqlite3 *db,            // 数据库实例

    const char *zSql,       // 需要检查的SQL语句

    int nByte,              // SQL语句的最大字节长度

    sqlite3_stmt **ppStmt,  // sqlite3_stmt实例,用来获得数据库数据

    const char **pzTail

);

4.查询一行数据
代码如下:

int sqlite3_step(sqlite3_stmt*); // 如果查询到一行数据,就会返回SQLITE_ROW

 
5.利用stmt获得某一字段的值(字段的下标从0开始)
代码如下:

double sqlite3_column_double(sqlite3_stmt*, int iCol);  // 浮点数据

int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型数据

sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 长整型数据

const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // 二进制文本数据

const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);  // 字符串数据

 

二、SQLite编码

1.创建、打开、关闭数据库

创建或打开数据库
代码如下:

// path是数据库文件的存放路径

sqlite3 *db = NULL;

int result = sqlite3_open([path UTF8String], &db);

 

代码解析:

sqlite3_open()将根据文件路径打开数据库,如果不存在,则会创建一个新的数据库。如果result等于常量SQLITE_OK,则表示成功打开数据库

sqlite3 *db:一个打开的数据库实例

数据库文件的路径必须以C字符串(而非NSString)传入

关闭数据库:sqlite3_close(db);

2.执行不返回数据的SQL语句

执行创表语句
代码如下:

char *errorMsg = NULL;  // 用来存储错误信息

char *sql = "create table if not exists t_person(id integer primary key autoincrement, name text, age integer);";

int result = sqlite3_exec(db, sql, NULL, NULL, &errorMsg);

 

代码解析:

sqlite3_exec()可以执行任何SQL语句,比如创表、更新、插入和删除操作。但是一般不用它执行查询语句,因为它不会返回查询到的数据

sqlite3_exec()还可以执行的语句:

(1)开启事务:begin transaction;

(2)回滚事务:rollback;

(3)提交事务:commit;

3.带占位符插入数据
代码如下:

char *sql = "insert into t_person(name, age) values(?, ?);";

sqlite3_stmt *stmt;

if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) {

    sqlite3_bind_text(stmt, 1, "母鸡", -1, NULL);

    sqlite3_bind_int(stmt, 2, 27);

}

if (sqlite3_step(stmt) != SQLITE_DONE) {

    NSLog(@"插入数据错误");

}

sqlite3_finalize(stmt);

 

代码解析:

sqlite3_prepare_v2()返回值等于SQLITE_OK,说明SQL语句已经准备成功,没有语法问题

sqlite3_bind_text():大部分绑定函数都只有3个参数

(1)第1个参数是sqlite3_stmt *类型

(2)第2个参数指占位符的位置,第一个占位符的位置是1,不是0

(3)第3个参数指占位符要绑定的值

(4)第4个参数指在第3个参数中所传递数据的长度,对于C字符串,可以传递-1代替字符串的长度

(5)第5个参数是一个可选的函数回调,一般用于在语句执行后完成内存清理工作

sqlite_step():执行SQL语句,返回SQLITE_DONE代表成功执行完毕

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

sqlite_finalize():销毁sqlite3_stmt *对象

4.查询数据
代码如下:

char *sql = "select id,name,age from t_person;";

sqlite3_stmt *stmt;

if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) {

    while (sqlite3_step(stmt) == SQLITE_ROW) {

        int _id = sqlite3_column_int(stmt, 0);

        char *_name = (char *)sqlite3_column_text(stmt, 1);

        NSString *name = [NSString stringWithUTF8String:_name];

        int _age = sqlite3_column_int(stmt, 2);

        NSLog(@"id=%i, name=%@, age=%i", _id, name, _age);

    }

}

sqlite3_finalize(stmt);

代码解析:

sqlite3_step()返回SQLITE_ROW代表遍历到一条新记录

sqlite3_column_*()用于获取每个字段对应的值,第2个参数是字段的索引,从0开始

展开更多 50%)
分享

猜你喜欢

简介iOS开发中应用SQLite的模糊查询和常用函数

编程语言 网络编程
简介iOS开发中应用SQLite的模糊查询和常用函数

iOS应用开发中SQLite的初步配置指南

编程语言 网络编程
iOS应用开发中SQLite的初步配置指南

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

iOS开发中Date Picker和UITool Bar控件的使用简介

编程语言 网络编程
iOS开发中Date Picker和UITool Bar控件的使用简介

Access中的模糊查询

编程语言 网络编程
Access中的模糊查询

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

API函数在VB开发中的应用

编程语言 网络编程
API函数在VB开发中的应用

iOS开发中UIImageView控件的常用操作整理

编程语言 网络编程
iOS开发中UIImageView控件的常用操作整理

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

XP系统的“本地安全策略” 的使用技巧

XP系统的“本地安全策略” 的使用技巧

Windows 2000中的NTLM安全策略讲解

Windows 2000中的NTLM安全策略讲解
下拉加载更多内容 ↓