仿闲鱼的搜索历史遇到的一些问题

在模仿闲鱼的搜索历史中,需要将结果保存在本地,并且有如下要求:
①搜索结果倒序展示,即最新的搜索结果展示在最上边
②搜索结果不能重复
③最多存储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仿闲鱼搜索历史

原文地址:https://www.cnblogs.com/Apologize/p/5662805.html