• IOS基于 fmdb数据库 的简单操作应用


      苹果给我们自带了sqlite ,但是用起来非常不友好,所以呢,一些大神在他原来的基础上封装了一层 FMDB libsqlite3.tbd

      今天,我们就来做一个简单的基于 FMDB 的数据库基本操作

      首先,我们应该去下载FMDB工程项目https://github.com/ccgus/fmdb.git 

      下载下来的是一个demo,大家可以把src文件夹拖出来再改名为FMDB,拖进自己的项目中就行了

      在项目里添加libsqlite3.dylib(xcode7的朋友添加 libsqlite3.tbd ),还有头文件#import "FMDatabase.h"(#import "FMDatabaseQueue.h")这个我们现在还是用不到,先不去管它了,我们先来看看他的效果

      

      看到了,我们要做的有三个界面,第一个是就是简单的通讯录了,第二个是添加界面,第三了就是 search了

      里面有一个我自己封装的XFNotices 这个其实很简单,我先贴上源码 或者你们直接在 demo 中抠出来

    线上 Code4App demo 地址: FMDB 基本使用 

      先说一下,我这是用 frame 布局,没有任何 SB XIB 直接贴到工程中即可使用

      我们先把主体框架搭建好

      首先,我们应该先写一个单例,原因我就不一一概述了

      创建继承与 NSObject 的文件

      #import "YXFDataFromDataBase.h"

    #import <Foundation/Foundation.h>
    
    @interface YXFDataFromDataBase : NSObject
    
    @property(retain,nonatomic) NSString *nameFromClass;
    
    @property(retain,nonatomic)NSString *ageFromClass;
    
    @property(retain,nonatomic)NSString *IDFromClass;
    
    @property(retain,nonatomic)NSMutableArray *nameArrayFromClass;
    
    +(YXFDataFromDataBase *)shareFromDataBase;
    
    @end

      #import "YXFDataFromDataBase.m"

    #import "YXFDataFromDataBase.h"
    
    @implementation YXFDataFromDataBase
    
    + (YXFDataFromDataBase *)shareFromDataBase
    {
        static YXFDataFromDataBase *sharedInstance = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            
            if (sharedInstance == nil) {
                sharedInstance = [[YXFDataFromDataBase alloc] init];
            }
            
        });
        return sharedInstance;
    }
    
    - (instancetype)init {
        self = [super init];
        if (self) {
            _nameFromClass = @"";
            _ageFromClass = @"";
            _IDFromClass = @"";
            _nameArrayFromClass = [[NSMutableArray alloc]initWithCapacity:0];
        }
        return self;
    }
    
    @end

      好了,单例写好了,以后我们用起来超级方便了哦!!!

      接着,在 AppDelegate.m 的头文件中 引入:

      #import "YXFAddressViewController.h" 

      #import "YXFAddUserViewController.h"

      #import "YXFSearchViewController.h"

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        self.window.backgroundColor = [UIColor whiteColor];
        [self.window makeKeyAndVisible];
        
        UITabBarController *tabbar = [[UITabBarController alloc] init];
        
        YXFAddressViewController *addressVC = [[YXFAddressViewController alloc] init];
        UINavigationController *addressNC = [[UINavigationController alloc] initWithRootViewController:addressVC];
        addressNC.tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemContacts tag:101];
        
        YXFAddUserViewController *addUserVC = [[YXFAddUserViewController alloc] init];
        UINavigationController *addUserNC = [[UINavigationController alloc] initWithRootViewController:addUserVC];
        addUserNC.tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemFavorites tag:102];
        
        YXFSearchViewController *searchVC = [[YXFSearchViewController alloc] init];
        UINavigationController *searchNC = [[UINavigationController alloc] initWithRootViewController:searchVC];
        searchNC.tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemSearch tag:103];
        
        
        tabbar.viewControllers = @[addressNC,addUserNC,searchNC];
        
        self.window.rootViewController = tabbar;
        
        return YES;
    }

      接下来就是创建第一个通讯录 VC

    创建一个 UITableViewController 就可以了  还有有一个自定义的 UITableViewCell

      #import "YXFAddressViewController.h"

    #import <UIKit/UIKit.h>
    
    @interface YXFAddressViewController : UITableViewController
    
    @property (nonatomic, strong) NSString *paths;
    
    @property (nonatomic, strong) NSMutableArray *nameArray;
    
    @property (nonatomic, strong) NSMutableArray *ageArray;
    
    @property (nonatomic, strong) NSMutableArray *IDArray;
    
    @end

       #import "YXFAddressViewController.m"

    #import "YXFAddressViewController.h"
    //这个是自己写的一个提示框
    #import "XFNotices.h"
    #import "FMDatabase.h"
    
    #import "FMDatabaseQueue.h"
    
    #import "YXFAddressViewCell.h"
    
    #import "YXFDataFromDataBase.h"
    
    #import "YXFAddUserViewController.h"
    
    @interface YXFAddressViewController ()
    
    @end
    
    @implementation YXFAddressViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.view.backgroundColor = [UIColor whiteColor];
        
        [self.tableView registerClass:[YXFAddressViewCell class] forCellReuseIdentifier:@"cell"];
     
        self.navigationItem.rightBarButtonItem = [[UIBarButtonItem  alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(modifyDatabase)];
        
    }
    
    - (void)viewWillAppear:(BOOL)animated
    {
        
        NSString *document = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
        NSString *path = [document stringByAppendingPathComponent:@"USER.sqlite"];
        self.paths = path;
    //注意以上三句话是获取数据库路径必不可少的,在viewDidload之前就已经准备好了
        self.nameArray = [[NSMutableArray alloc]init];
        self.ageArray = [[NSMutableArray alloc]init];
        self.IDArray = [[NSMutableArray alloc]init];
        [self createTable];
        [self getAllDatabase];
    }
    
    
    #pragma mark - Table view data source
    
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return 1;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return self.nameArray.count + 1;
    }
    
    - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row == 0) {
            return nil;
        }else
        {
            return indexPath;
        }
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        YXFAddressViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
    
        if (indexPath.row == 0) {
            cell.nameLabel.text = @"姓名";
            cell.ageLabel.text = @"年龄";
            cell.ID.text = @"ID";
        }else
        {
            cell.nameLabel.text = [self.nameArray objectAtIndex:indexPath.row -1];
            cell.ageLabel.text = [self.ageArray objectAtIndex:indexPath.row - 1];
            cell.ID.text = [self.IDArray objectAtIndex:indexPath.row - 1];
        }
        
        
        return cell;
    }
    
    - (void)createTable
    {
        NSFileManager *fileManager = [NSFileManager defaultManager];
        if (![fileManager fileExistsAtPath:self.paths]) {
            NSLog(@"表不存在,创建表");
            FMDatabase *db =[FMDatabase databaseWithPath:self.paths];
            if ([db open]) {
                NSString *sql = @"CREATE TABLE 'USER'('id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 'name' VARCHAR(20),'age' VARCHAR(20),'idcode' VARCHAR(30))    ";//sql语句
                BOOL success = [db executeUpdate:sql];
                if (!success) {
                    NSLog(@"error when create table ");
                }else{
                    NSLog(@"create table succeed");
                }
                [db close];
            }else{
                NSLog(@"database open error");
            }
        }
    }
    
    - (void)getAllDatabase//从数据库中获得所有数据
    {
        FMDatabase *db = [FMDatabase databaseWithPath:self.paths];
        if ([db open]) {
            NSString *sql = @"SELECT * FROM USER";
            FMResultSet *rs = [db executeQuery:sql];
            while ([rs next]) {
                NSString *name = [rs stringForColumn:@"name"];
                NSString *age = [rs stringForColumn:@"age"];
                NSString *ID = [rs stringForColumn:@"idcode"];
                
                [self.nameArray addObject:name];
                [self.ageArray addObject:age];
                [self.IDArray addObject:ID];
            }
            [[YXFDataFromDataBase shareFromDataBase].nameArrayFromClass arrayByAddingObjectsFromArray:self.nameArray];
            NSLog(@"self.nameArray==%@",self.nameArray);
            [db close];
            [self.tableView reloadData];
        }
        
    }
    
    //选中相应的行,进入更新界面,注意这里没有对数据库进行操作
    - (void)modifyDatabase
    {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        
        if (indexPath == nil) {
    
            [XFNotices noticesWithTitle:@"数据更新" Time:1.5 View:self.view Style:(XFNoticesStyleSuccess)];
            
            return;
        }
        else{
            YXFAddUserViewController *addUser = [[YXFAddUserViewController alloc]init];
            addUser.operateType = 1;
            //下面的方法是将选中的行的数据存进单例,再传到另一个类里面
            [YXFDataFromDataBase shareFromDataBase].nameFromClass = [self.nameArray objectAtIndex:(indexPath.row-1)];
            [YXFDataFromDataBase shareFromDataBase].IDFromClass = [self.IDArray objectAtIndex:(indexPath.row-1)];
            [YXFDataFromDataBase shareFromDataBase].ageFromClass = [self.ageArray objectAtIndex:(indexPath.row-1)];
            NSLog(@"datafromdatabase.nameFromClass==%@",[YXFDataFromDataBase shareFromDataBase].nameFromClass);
            //跳转到修改页面
            [self.navigationController pushViewController:addUser animated:YES];
        }
    }

      #import "YXFAddressViewCell.h"  

    #import <UIKit/UIKit.h>
    
    @interface YXFAddressViewCell : UITableViewCell
    
    @property (nonatomic, strong) UILabel *nameLabel;
    
    @property (nonatomic, strong) UILabel *ageLabel;
    
    @property (nonatomic, strong) UILabel *ID;
    
    @end

       #import "YXFAddressViewCell.m"

    #import "YXFAddressViewCell.h"
    
    @implementation YXFAddressViewCell
    
    - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
    {
        if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
            
            [self p_setupView];
        }
        return self;
    }
    
    - (void)p_setupView
    {
        self.nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.contentView.frame) / 3, CGRectGetHeight(self.contentView.frame))];
        self.nameLabel.textAlignment = NSTextAlignmentCenter;
        [self.contentView addSubview:_nameLabel];
        
        self.ageLabel = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(self.nameLabel.frame), 0, CGRectGetWidth(self.contentView.frame) / 3, CGRectGetHeight(self.contentView.frame))];
        self.ageLabel.textAlignment = NSTextAlignmentCenter;
        [self.contentView addSubview:_ageLabel];
        
        self.ID = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(self.ageLabel.frame), 0, CGRectGetWidth(self.contentView.frame) / 3, CGRectGetHeight(self.contentView.frame))];
        self.ID.textAlignment = NSTextAlignmentCenter;
        [self.contentView addSubview:_ID];
        
    }

      现在运行是没有数据的 , 因为我们还没有添加数据,接下来,我们就来编写添加用户的代码

       

      #import "YXFAddUserViewController.h" 

      

    #import <UIKit/UIKit.h>
    
    @interface YXFAddUserViewController : UIViewController
    
    {
        NSInteger operateType1;//保存操作类型,0是添加,1是修改
    }
    @property (nonatomic, strong) NSMutableArray *textFieldArray;
    
    @property (nonatomic, strong) NSString *dbPath;
    
    @property (nonatomic, strong) UITextField *nameTextField;
    
    @property (nonatomic, strong) UITextField *ageTextField;
    
    @property (nonatomic, strong) UITextField *IDTextField;
    
    @property (nonatomic, assign) NSInteger operateType;
    
    @end

       #import "YXFAddUserViewController.m"

    #import "YXFAddUserViewController.h"
    
    #import "YXFDataFromDataBase.h"
    #import "FMDatabase.h"
    #import "XFNotices.h"
    
    @interface YXFAddUserViewController () <UITextFieldDelegate>
    
    @end
    
    @implementation YXFAddUserViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.view.backgroundColor = [UIColor whiteColor];
        
        NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSString *path = [doc stringByAppendingPathComponent:@"user.sqlite"];
        NSLog(@"path===%@",path);
        self.dbPath = path;
        
        NSArray *array = [NSArray arrayWithObjects:@"姓名",@"年龄",@"ID", nil];
        for (int i = 0; i < 3 ; i++)
        {
            UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake( 70,i * 40 + 134, 100, 30)];
            label.text = [array objectAtIndex:i];
            [self.view addSubview:label];
        }
        
        _nameTextField = [[UITextField alloc]initWithFrame:CGRectMake(150, 138, 100, 30)];
        _nameTextField.borderStyle = UITextBorderStyleRoundedRect;
        _nameTextField.placeholder = @"请输入姓名";
        _nameTextField.delegate = self;
        [self.view addSubview:_nameTextField];
        _ageTextField = [[UITextField alloc]initWithFrame:CGRectMake(150, 178, 100, 30)];
        _ageTextField.borderStyle = UITextBorderStyleRoundedRect;
        _ageTextField.placeholder = @"请输入年龄";
        _ageTextField.delegate = self;
        [self.view addSubview:_ageTextField];
        _IDTextField = [[UITextField alloc]initWithFrame:CGRectMake(150, 218, 100, 30)];
        _IDTextField.borderStyle = UITextBorderStyleRoundedRect;
        _IDTextField.placeholder = @"请输入ID";
        _IDTextField.delegate = self;
        [self.view addSubview:_IDTextField];
        if (_operateType == 1) {//operateType == 1时为修改
            
            _nameTextField.text = [YXFDataFromDataBase shareFromDataBase].nameFromClass;
            _IDTextField.text = [YXFDataFromDataBase shareFromDataBase].IDFromClass;
            _ageTextField.text = [YXFDataFromDataBase shareFromDataBase].ageFromClass;
            _IDTextField.enabled = NO;
            NSLog(@"datafromdatabase.nameFromClass=%@",[YXFDataFromDataBase shareFromDataBase].nameFromClass);
            
        }
        NSLog(@"operateType==%ld",operateType1);
        if (_operateType == 0){
            UIBarButtonItem *addBtn = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addNewUserInfo)];
            self.navigationItem.rightBarButtonItem = addBtn;
        }
        if(_operateType == 1){//这里是后来添加的,其实可以放到上面
            UIBarButtonItem *addBtn = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemSave target:self action:@selector(addNewUserInfo)];
            self.navigationItem.rightBarButtonItem = addBtn;
            
        }
        
    }
    
    //添加详细信息
    - (void)addNewUserInfo
    {
        FMDatabase *db = [[FMDatabase alloc]initWithPath:self.dbPath];
        if ([db open]) {
            
            if (_nameTextField.text.length == 0||_ageTextField.text.length == 0||_IDTextField.text.length == 0){
                
                [XFNotices noticesWithTitle:@"请完成填写信息" Time:1.5 View:self.view Style:(XFNoticesStyleFail)];
            }else{
                NSLog(@"姓名==%@,年龄==%@,ID==%@",_nameTextField.text,_ageTextField.text,_IDTextField.text);
                NSString *sql= nil;
                if (self.operateType == 0){//执行插入操作
                    sql = @"INSERT INTO USER (name,age,idcode) VALUES (?,?,?) ";
                }else if(_operateType == 1)//执行更新操作
                {
                    sql = @"UPDATE USER  SET name = ? , age = ? where idcode = ?";
                    
                }
                
                BOOL res = [db executeUpdate:sql,_nameTextField.text,_ageTextField.text,_IDTextField.text];
                if (!res) {
                    [XFNotices noticesWithTitle:@"数据插入错误" Time:1.5 View:self.view Style:(XFNoticesStyleFail)];
                }else{
                    [XFNotices noticesWithTitle:@"数据插入成功" Time:1.5 View:self.view Style:(XFNoticesStyleFail)];
                }
            }
        }else{
            NSLog(@"数据库打开失败") ;
        }
        if (operateType1 == 0)//如果是添加就留在该页,如果是修改就跳回上一页
        {
            [_nameTextField resignFirstResponder];
            [_ageTextField resignFirstResponder];
            [_IDTextField resignFirstResponder];
            _nameTextField.text = @"";
            _ageTextField.text = @"";
            _IDTextField.text = @"";
            [self.navigationController popViewControllerAnimated:YES];
        }
        [db close];
    }
    
    //让键盘隐藏
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        [_nameTextField resignFirstResponder];
        [_ageTextField resignFirstResponder];
        [_IDTextField resignFirstResponder];
    }
    
    
    //页面将要消失的时候执行,将UITextField清空
    -(void)viewWillDisappear:(BOOL)animated{
        [super viewWillDisappear:YES];
        _nameTextField.text = nil;
        _ageTextField.text = nil;
        _IDTextField.text = nil;
    }
    
    @end

       这个界面就这么多  

      我们继续创建我们的第三个界面 search 这个界面运用了 UISearchBar一开始我还是不怎么了解,想了超长时间,不过还是弄好了!!

      #import "YXFSearchViewController.h"

      

    #import <UIKit/UIKit.h>
    
    @interface YXFSearchViewController : UITableViewController
    
    @property (nonatomic, strong) NSString *dbpath;
    /*
     用于保存搜索出姓名的结果
     */
    @property (nonatomic, strong) NSMutableArray *searchResults;
    /*
     用来保存搜索的年龄信息
     */
    @property (nonatomic, strong) NSMutableArray *searchAgeResults;
    /*
     用来保存搜索的ID信息
     */
    @property (nonatomic, strong) NSMutableArray *searchIDResult;
    /*
     保存搜索之前的姓名信息
     */
    @property (nonatomic, strong) NSMutableArray *nameArray;
    /*
     保存搜索之前的年龄信息
     */
    @property (nonatomic,strong) NSMutableArray *ageArray;
    
    /*
     保存搜索之前的ID信息
     */
    @property (nonatomic,strong) NSMutableArray *IDArray;
    /*
     用来保存搜索的年龄信息
     */
    @property (nonatomic,assign) BOOL searchWasActive;
    /*
     这个好像没用了
     */
    @property (nonatomic,assign) NSString *savedSearchTerm;
    
    @property (nonatomic,retain) NSString *namestr;
    @property (nonatomic,retain) NSString *agestr;
    @property (nonatomic,retain) NSString *IDstr;
    
    @end

      #import "YXFSearchViewController.m"

    #import "YXFSearchViewController.h"
    #import "YXFAddUserViewController.h"
    #import "YXFAddressViewController.h"
    #import "FMDatabase.h"
    #import "YXFDetailViewController.h"
    @interface YXFSearchViewController () <UISearchBarDelegate,UISearchControllerDelegate>
    
    @property (nonatomic, strong) UISearchDisplayController *searchController;
    
    @end
    
    @implementation YXFSearchViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        self.view.backgroundColor = [UIColor whiteColor];
        
        //搜索比较复杂,既要初始化UISearchBar,又要初始化UISearchDisplayController,然后还要写UITableViewDelegate里的-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath和-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section方法,还要设置一大堆代理,慢慢往下看
        UISearchBar *search = [[UISearchBar alloc]initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width -50, 44)];
        search.placeholder = @"请输入姓名";
        search.autocorrectionType = UITextAutocorrectionTypeNo;//不自动纠错,貌似没啥用
        search.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters;//所有字母大写 ,也没啥用
        
        search.showsScopeBar = YES;
        search.delegate = self;//UISearchBar设置代理
        search.keyboardType = UIKeyboardTypeNamePhonePad;
        self.tableView.tableHeaderView = search;
        self.tableView.dataSource = self;
        
        _searchController = [[UISearchDisplayController alloc]initWithSearchBar:search contentsController:self];
        _searchController.active = NO;
        
        _searchController.delegate = self;//UISearchDisplayController设置代理
        
        _searchController.searchResultsDelegate=self;//还是代理
        
        _searchController.searchResultsDataSource = self;//有完没完
        NSString *document = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
        NSString *path = [document stringByAppendingPathComponent:@"user.sqlite"];
        NSLog(@"path==%@",path);
        self.dbpath = path;
        self.tableView.delegate = self;//tableView的代理,为什么这么写,因为这个类是继承UITableView的,要注意!不是继承UIViewController的!
        self.tableView.dataSource = self;
        _nameArray = [[NSMutableArray alloc]initWithCapacity:0];
        _ageArray = [[NSMutableArray alloc]initWithCapacity:0];
        _IDArray= [[NSMutableArray alloc]initWithCapacity:0];
        
        [self getAllDatabase];
        [self.tableView reloadData];
        
    }
    
    - (void)viewWillAppear:(BOOL)animated
    {
        [self.tableView reloadData];
    }
    
    - (void)getAllDatabase
    {
        FMDatabase *db = [FMDatabase databaseWithPath:self.dbpath];
        if ([db open]) {
            NSString *sql = @"SELECT * FROM USER";
            FMResultSet *rs = [db executeQuery:sql];
            while ([rs next]) {
                NSString *name = [rs stringForColumn:@"name"];
                NSString *age = [rs stringForColumn:@"age"];
                NSString *ID = [rs stringForColumn:@"idcode"];
                
                [self.nameArray addObject:name];
                [self.ageArray addObject:age];
                [self.IDArray addObject:ID];
            }
            self.searchResults = [[NSMutableArray alloc]initWithArray:_nameArray copyItems:YES];
            self.searchAgeResults = [[NSMutableArray alloc]initWithArray:_ageArray copyItems:YES];
            self.searchIDResult = [[NSMutableArray alloc]initWithArray:_IDArray copyItems:YES];
            NSLog(@"search from nameArray==%@",self.nameArray);
            [db close];
        }
    }
    
    #pragma mark - Table view data source
    
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return 1;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    
        NSInteger row = 0;
        if ([tableView isEqual:self.searchDisplayController.searchResultsTableView]) {//记住这个格式,如果当前的table就是用于显示所搜信息的table的话。因为UISearchDisplayController这货自带一个table
            row = [self.searchResults count];
        }else{
            [self.nameArray count];
        }
        return row;
    }
    
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        
        static NSString *cellIdentifier = @"cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        if (cell == nil) {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        }
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        if ([tableView isEqual:self.searchDisplayController.searchResultsTableView]) {
            cell.textLabel.text = [_searchResults objectAtIndex:indexPath.row];
            //        cell.detailTextLabel.text = [NSString stringWithFormat:@"电话:%@",[searchResults objectAtIndex:indexPath.row]];//不知道为什么不显示cell.detailTextLabel.text ,有人知道的话告诉我一下
        }else{
            cell.textLabel.text = [self.nameArray objectAtIndex:indexPath.row];
        }
        return cell;
    }
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        YXFDetailViewController *detailInfo = [[YXFDetailViewController alloc]init];
        detailInfo.nameStr = [self.searchResults objectAtIndex:indexPath.row];
        detailInfo.ageStr = [self.searchAgeResults objectAtIndex:indexPath.row];
        detailInfo.IDsStr = [self.searchIDResult objectAtIndex:indexPath.row];
        NSLog(@"self.namestr==%@",self.namestr);
        
        NSArray *array = [self.navigationController viewControllers];//先获取视图控制器数组
        UINavigationController *nav = [array objectAtIndex:[array count] - 1];//获取当前的导航试图控制器
        [nav.navigationController pushViewController:detailInfo animated:YES];//跳转到删除页面
    }
    
    
    #pragma mark -UISearchControllerDisplay-//设置搜索范围
    //下面注意了,下面的方法是实现搜索功能的,后面两个长得很像的方法是UISearchControllerDisplay代理里的方法,我也搞不懂是干什么用的,他们的格式很固定,大家记住就行了。
    
    - (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
    {
        [self searchBarSearchButtonClicked:self.searchDisplayController.searchBar];
        
    }
    
    - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar//从数据库搜索
    {
        FMDatabase *db = [FMDatabase databaseWithPath:self.dbpath];
        if ([db open]) {
            
            [_searchResults removeAllObjects];
            [_searchAgeResults removeAllObjects];
            [_searchIDResult removeAllObjects];
            NSString *sql = @"SELECT * FROM USER WHERE name like ?";
            FMResultSet *rs = [db executeQuery:sql,searchBar.text];
            while ([rs next]) {
                self.namestr = [rs stringForColumn:@"name"];
                self.agestr = [rs stringForColumn:@"age"];
                self.IDstr = [rs stringForColumn:@"idcode"];
                
                [self.searchResults addObject:_namestr];
                [self.searchAgeResults addObject:_agestr];
                [self.searchIDResult addObject:_IDstr];
            }
            
            NSLog(@"searchResults == %@",_searchResults);
            NSLog(@"searchAgeResults==%@",_searchAgeResults);
            NSLog(@"searchIDResult==%@",_searchIDResult);
            NSLog(@"search===%@",searchBar.text);
            
        }
        [db close];
        
    }
    
    #pragma mark -
    #pragma mark UISearchDisplayController Delegate Methods设置代理方法
    
    - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
    {
        [self filterContentForSearchText:searchString scope:
         [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
    
        return YES;
    }
    
    
    - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
    {
        [self filterContentForSearchText:[self.searchDisplayController.searchBar text] scope:
         [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];
        
        return YES;
    }
    
    @end

      在搜索框里面查到我们数据,我们可以点击进入详细界面,那么,我们就来创建详细界面吧,数据库的删除就在这里面实现了!

      #import "YXFDetailViewController.h"

    #import <UIKit/UIKit.h>
    
    @interface YXFDetailViewController : UIViewController
    
    @property(nonatomic, strong) NSString *dbpath;
    
    @property(nonatomic, strong) NSString *nameStr;
    
    @property(nonatomic, strong) NSString *ageStr;
    
    @property(nonatomic, strong) NSString *IDsStr;
    
    @end

      #import "YXFDetailViewController.m"

    #import "YXFDetailViewController.h"
    
    #import "FMDatabase.h"
    #import "XFNotices.h"
    
    @interface YXFDetailViewController ()
    
    @end
    
    @implementation YXFDetailViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.view.backgroundColor = [UIColor whiteColor];
        
        self.title = @"详细信息";
        NSArray *array = [NSArray arrayWithObjects:@"姓名:",@"年龄:",@"ID:", nil];
        NSArray *array2 = [NSArray arrayWithObjects:self.nameStr,self.ageStr,self.IDsStr, nil];
        
        for (int i = 0; i < 3 ; i++)
        {
            UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake( 70,i * 40 + 134, 100, 30)];
            label.text = [array objectAtIndex:i];
            [self.view addSubview:label];
            
            UILabel *label2 = [[UILabel alloc]initWithFrame:CGRectMake(140, i * 40 +135, 100, 30)];
            label2.text = [array2 objectAtIndex:i];
            [self.view addSubview:label2];
        }
        NSString *document = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
        NSString *path = [document stringByAppendingPathComponent:@"USER.sqlite"];
        self.dbpath = path;
        
        UIBarButtonItem *deleteButton = [[UIBarButtonItem alloc]initWithTitle:@"删除" style:UIBarButtonItemStyleDone target:self action:@selector(deleteFromDatabase)];
        self.navigationItem.rightBarButtonItem = deleteButton;
        
    }
    
    - (void)deleteFromDatabase//从数据库删除信息
    {
        FMDatabase *db = [FMDatabase databaseWithPath:self.dbpath];
        if ([db open]) {
            NSString *sql = @"DELETE FROM USER WHERE name = ? and age = ? and idcode = ?";
            if (self.nameStr.length != 0&&self.ageStr.length != 0&&self.IDsStr.length !=0){
                BOOL rs = [db executeUpdate:sql,self.nameStr,self.ageStr,self.IDsStr]; //后面跟的三个参数就是sql语句里的三个问号对应
                if (rs) {
                    [XFNotices noticesWithTitle:@"删除成功" Time:1 View:self.view Style:(XFNoticesStyleSuccess)];
                    [self.navigationController popViewControllerAnimated:YES];
                }else{
                    [XFNotices noticesWithTitle:@"删除失败" Time:1 View:self.view Style:(XFNoticesStyleFail)];
                }
            }
        }
        [db close];
    }
    
    
    @end

      好了 都完成了,接下来 运行编译 看看效果吧 

      上面,我已经贴上demo 的地址了,但是还是希望刚刚接触的朋友自己写一遍,要是碰到什么 bug 希望能告诉我,我及时更正错误!

  • 相关阅读:
    activemq 异步和同步接收
    简单的activemq的封装和使用
    activemq 一个不错的ppt
    activemq 的小实验
    activemq api的封装
    观察者设计模式例子
    【转载】自定义类加载器例子
    京东拍拍网 笔试 搞java的去考C++ 苦逼
    java中用equals比较两个内容相同的字符数组
    云端飘 String s=new String("abc")创建了几个对象?
  • 原文地址:https://www.cnblogs.com/yxfBlogs/p/4975323.html
Copyright © 2020-2023  润新知