zoukankan      html  css  js  c++  java
  • 仿闲鱼的搜索历史遇到的一些问题

    在模仿闲鱼的搜索历史中,需要将结果保存在本地,并且有如下要求:
    ①搜索结果倒序展示,即最新的搜索结果展示在最上边
    ②搜索结果不能重复
    ③最多存储10条
    本地存储需要用到FMDB,先说下其它的

    1.使用FMDB时,真机上提示error opening!: 14错误问题
    该问题是模拟器上一切正常,可以正常的添加、删除数据。数据库表路径为

    NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *filePath = [file stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.sqlite",FileName]];
    self.dbPath = filePath;

    但一到真机上,就提示error opening!: 14,此时按照网上的方法解决,但没啥用。但另一个demo就可以正常运行,但从
    问题表现来看,应该是路径的问题。这才想起来,这两个demo建表时,用的表名都是一样的,但二者的表结构不同,所以导致这问题。
    解决方法也很简单,改个表名,让两个demo创建的表的路径不同就行了。这问题在模拟器上不会出现,但在真机上就有,绕了这么大圈子,竟是这个蛋疼的问题。

     

    2.UISearchBar设置clear button的显示时机

    可以用

    UITextField *textField = [searchBar valueForKey:@"_searchField"];
    textField.clearButtonMode = UITextFieldViewModeWhileEditing;

    修改cancle按钮,可以用

    -(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{
        //需要设置该属性为YES
        searchBar.showsCancelButton = YES;
        for(UIView *view in  [[[searchBar subviews] objectAtIndex:0] subviews]) {
            if([view isKindOfClass:[NSClassFromString(@"UINavigationButton") class]]) {
                UIButton * cancel =(UIButton *)view;
                [cancel setTitle:@"取消" forState:UIControlStateNormal];
                cancel.titleLabel.font = [UIFont systemFontOfSize:14];
            }
        }
    }

    修改取消按钮字体颜色,不是如上边在for循环里边写

    [cancel setTitleColor:[UIColor colorWithHexString:@"#333333"] forState:UIControlStateNormal];
    [cancel setTitleColor:[UIColor greenColor] forState:UIControlStateSelected];

    这是没作用的,得如下这样设置。

    [_searchBar setTintColor:[UIColor colorWithHexString:@"#333333"]];

     

    3.回到正题,对于仿闲鱼这些要求,可以如下解决

    ①搜索结果倒序展示,即最新的搜索结果展示在最上边

    对于该条需求,只需在FMDB搜索时,按照主键rowid倒序展示即可

    -(NSMutableArray *)findAllSearch{
        NSMutableArray *arr = [NSMutableArray array];
        FMDatabase *db = [FMDatabase databaseWithPath:self.dbPath];
        if ([db open]) {
            NSString *sql = [NSString stringWithFormat:@"SELECT * FROM %@ order by rowid desc",TableName];
            FMResultSet *rs = [db executeQuery:sql];
            while ([rs next]) {
                NSString *keyWord = [rs stringForColumn:@"keyWord"];
                [arr addObject:keyWord];
            }
            [db close];
        }
        return arr;
    }

    ②搜索结果不能重复

    /** 去除数据库已有的相同搜索结果,先删除旧的,再插入新的,这样不影响结果显示 */
    -(void)removeSameData:(NSString *)searchStr{
        NSArray *tempArr = [[SHSearchDBManager shareSearchDBManage] findAllSearch];
        if ([tempArr containsObject:searchStr]) {
            [[SHSearchDBManager shareSearchDBManage] deleteSearchStrByKeyword:searchStr];
        }
        [[SHSearchDBManager shareSearchDBManage] insterSearchArr:searchStr];
    }

     

    ③最多存储10条

    #define MaxCount    10 //最多历史结果条数
    
    /** 保持数据库只存10条数据,若有新的,则删除最旧的 */
    -(void)moreThanMaxNumSearchStr:(NSString *)searchStr{
        NSArray *tempArr = [[SHSearchDBManager shareSearchDBManage] findAllSearch];
        if (tempArr.count > MaxCount) {
            [[SHSearchDBManager shareSearchDBManage] deleteTheOldestSearchStr];
        }
    }

    然后在往数据库添加新数据时,去重和限制条数是有顺序的

    -(void)insertDataBase:(NSString *)searchStr{
        if (searchStr.length==0) {
            return;
        } else {
            //先去重再添加新的
            [self removeSameData:searchStr];
            [self moreThanMaxNumSearchStr:searchStr];
            [_historyTableView reloadData];
        }
    }

    最后附上demo地址:github仿闲鱼搜索历史

  • 相关阅读:
    scanf()常犯错误
    C语言,链表反转
    c语言: 冒泡排序
    判断一个数是否为2的若干次幂
    计算一个整数中含1的个数
    ELF文件的加载过程(load_elf_binary函数详解)--Linux进程的管理与调度(十三)
    Linux进程启动过程分析do_execve(可执行程序的加载和运行)---Linux进程的管理与调度(十一)
    Linux内核线程kernel thread详解--Linux进程的管理与调度(十)
    Linux下进程的创建过程分析(_do_fork do_fork详解)--Linux进程的管理与调度(八)
    Linux下2号进程的kthreadd--Linux进程的管理与调度(七)
  • 原文地址:https://www.cnblogs.com/Apologize/p/5662805.html
Copyright © 2011-2022 走看看