1. 程式人生 > >【iOS】一種仿京東搜尋歷史記錄的表格的實現(sqlite3的使用)

【iOS】一種仿京東搜尋歷史記錄的表格的實現(sqlite3的使用)

功能點

準確的來說,不是仿製京東的,因為年前就是做好了這個功能。昨天看看京東,發現效果是一樣的。
年前公司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];
        }
    }
}
程式碼下載地址請點選我