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