【iOS】一種仿京東搜尋歷史記錄的表格的實現(sqlite3的使用)
阿新 • • 發佈:2018-12-23
功能點
準確的來說,不是仿製京東的,因為年前就是做好了這個功能。昨天看看京東,發現效果是一樣的。
年前公司APP的功能需求點:
1.限制最多儲存20條歷史搜尋資料(Demo為了演示,做的是5條)
2.最新的歷史資料在最上面
3.資料不能重複
4.歷史資料支援點選,點選後發起搜尋(Demo做的是彈出框展示)
效果圖
在公司的專案中,由於整個專案使用的是FMDB,為了再次複習一下sqlite3,所以我直接使用的是sqlite3,沒有使用封裝之後的FMDB
資料庫的操作
需求難點
1.最新的資料展示在最上面
我的解決辦法:資料庫還是按照正常的寫入和讀取方法操作,我們在最資料顯示的時候,先把資料逆序後再顯示
陣列逆序:
/**
* 陣列逆序
*
* @param array 需要逆序的陣列
*
* @return 逆序後的輸出
*/
- (NSMutableArray *)exchangeArray:(NSMutableArray *)array{
NSInteger num = array.count;
NSMutableArray *temp = [[NSMutableArray alloc] init];
for (NSInteger i = num - 1; i >= 0; i --) {
[temp addObject:[array objectAtIndex:i]];
}
return temp;
}
2.資料不能重複
實現這個功能點,需要先實現資料不能重複和限制條數這兩個功能點
資料不能重複,我的解決辦法:先用搜索的關鍵字去資料庫查詢,如果有相同的就先刪除資料庫裡面相同的資料,在插入新的資料;
經過測試這個可以有效的實現資料不能重複的這個功能,且不影響最新的資料展示在最上面這個功能點
/**
* 去除資料庫中已有的相同的關鍵詞
*
* @param keyword 關鍵詞
*/
- (void)removeSameData:(NSString *)keyword{
NSMutableArray *array = [[SearchDBManage shareSearchDBManage] selectAllSearchModel];
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
SearchModel *model = (SearchModel *)obj;
if ([model.keyWord isEqualToString:keyword]) {
[[SearchDBManage shareSearchDBManage] deleteSearchModelByKeyword:keyword];
}
}];
}
3.限制搜尋歷史資料條數(假設是限制20條)
這個我的思路是,第19條資料那裡是一個分界點
資料庫裡面的資料小於等於19條的時候,直接插入資料庫(暫不考慮去重的問題)
資料庫裡面的資料大於19條的時候,先資料左移,去除數組裡面的第0個元素,清空資料庫,再把新的陣列寫入資料庫
/**
* 多餘20條資料就把第0條去除
*
* @param keyword 插入資料庫的模型需要的關鍵字
*/
- (void)moreThan20Data:(NSString *)keyword{
// 讀取資料庫裡面的資料
NSMutableArray *array = [[SearchDBManage shareSearchDBManage] selectAllSearchModel];
if (array.count > MAX_COUNT - 1) {
NSMutableArray *temp = [self moveArrayToLeft:array keyword:keyword]; // 陣列左移
[[SearchDBManage shareSearchDBManage] deleteAllSearchModel]; //清空資料庫
[self.dataArray removeAllObjects];
[self.tabeleView reloadData];
[temp enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
SearchModel *model = (SearchModel *)obj; // 取出 數組裡面的搜尋模型
[[SearchDBManage shareSearchDBManage] insterSearchModel:model]; // 插入資料庫
}];
}
else if (array.count <= MAX_COUNT - 1){ // 小於等於19 就把第20條插入資料庫
[[SearchDBManage shareSearchDBManage] insterSearchModel:[SearchModel creatSearchModel:keyword currentTime:[self getCurrentTime]]];
}
}
/**
* 陣列左移
*
* @param array 需要左移的陣列
* @param keyword 搜尋關鍵字
*
* @return 返回新的陣列
*/
- (NSMutableArray *)moveArrayToLeft:(NSMutableArray *)array keyword:(NSString *)keyword{
[array addObject:[SearchModel creatSearchModel:keyword currentTime:[self getCurrentTime]]];
[array removeObjectAtIndex:0];
return array;
}
最後再把上面的方法封裝一下,做一個插入資料庫的方法:
/**
* 關鍵詞插入資料庫
*
* @param keyword 關鍵詞
*/
- (BOOL)insterDBData:(NSString *)keyword{
if (keyword.length == 0) {
return NO;
}
else{//搜尋歷史插入資料庫
//先刪除資料庫中相同的資料
[self removeSameData:keyword];
//再插入資料庫
[self moreThan20Data:keyword];
// 讀取資料庫裡面的資料
self.dataArray = [[SearchDBManage shareSearchDBManage] selectAllSearchModel];
[self.tabeleView reloadData];
return YES;
}
}
清楚搜尋歷史,就是清空資料庫和清空搜尋資料模型集合的陣列後reload一下tableView
/**
* 清空搜尋歷史操作
*/
- (void)clearButtonClick{
[[SearchDBManage shareSearchDBManage] deleteAllSearchModel];
[self.dataArray removeAllObjects];
[self.tabeleView reloadData];
}
UISearchBar修改右邊取消按鈕的方法
在它的代理- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar;裡面實現下面的操作就可以了。
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{
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];
}
}
}
程式碼下載地址:請點選我