Панель UISearchBar не фильтрует sqlite UITableView

#ios #objective-c #sqlite #uitableview #uisearchbar

#iOS #objective-c #sqlite #uitableview #панель uisearchbar

Вопрос:

Привет, у меня есть TableView, который заполняется базой данных sqlite, я настроил UISearchBar для его фильтрации, но он не возвращает результатов. Вот мой код для панели поиска:

 -(void)searchBar:(UISearchBar*)searchBar textDidChange:(NSString*)text
{
    if(text.length == 0)
    {
        isFiltered = FALSE;
    }
    else
    {
        isFiltered = true;
        entriesFiltered = [[NSMutableArray alloc] init];
        NSString *queryPart1 = @"SELECT * FROM table WHERE name LIKE '%";
        NSString *queryPart2 = @"'% ORDER BY name";
        NSString *sql = [NSString stringWithFormat:@"%@%@%@", queryPart1, text, queryPart2];
        sqlite3_stmt *statement;

        if(sqlite3_prepare_v2(db, [sql UTF8String], -1, amp;statement, nil)==SQLITE_OK)
        {
            while (sqlite3_step(statement)==SQLITE_ROW) {

                char *field2 = (char *) sqlite3_column_text(statement,1);
                NSString *field2Str = [[NSString alloc]initWithUTF8String:field2];

                NSString *str = [[NSString alloc]initWithFormat:@"%@", field2Str];


                [entriesFiltered addObject:str ];

            }
            sqlite3_finalize(statement);
        }
    }

    [self.theTable reloadData];
}
  

Вот код для представления таблицы

 -(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView
{
    //return the number of sections.
    return 1;
}

-(NSInteger)tableView:(UITableView *) tableView numberOfRowsInSection:(NSInteger)section
{
    //Return the number of rows in the section
    if(isFiltered){
        return [entriesFiltered count];
    } else {
        return [entries count];
    }


}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    //UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    //Congigure the cell...
    if(isFiltered){
        cell.textLabel.text = [entriesFiltered objectAtIndex:indexPath.row];
        return cell;
    } else {
        cell.textLabel.text = [entries objectAtIndex:indexPath.row];
        return cell;
    }

}

#pragma mark - Table view delegate

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{


}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

   NSIndexPath *indexPath = [self.theTable indexPathForSelectedRow];
   NSLog(@" indexPath row %ld",(long)indexPath.row);
   speakerViewController *svc = [segue destinationViewController];
   svc.labelText = descriptions[indexPath.row];
   svc.url = urls[indexPath.row];

}
  

Проблема в sql-запросе для поиска? Было бы лучше просто выполнить поиск в массиве вместо запроса к базе данных? если да, то как мне это сделать?

Любая помощь будет высоко оценена.

Комментарии:

1. Я бы извлек результаты в память и использовал их после, если бы они были относительно небольшим набором. Если вы действительно хотите сделать это в запросе, проверьте запрос! Я не понимаю, почему вы ВЫБИРАЕТЕ * ИЗ таблицы, ГДЕ имя ПОХОЖЕ НА ‘% ..? Это должно быть SELECT * ИЗ таблицы, ГДЕ имя НРАВИТСЯ? и затем вы передаете аргумент в sql или затем ВЫБИРАЕТЕ * ИЗ таблицы, ГДЕ имя ТИПА ‘%@’ должно быть заменено другой строкой. Другое дело, вы проверили, разрешены ли предикаты?

2. вы выполняете entriesFiltered = [[NSMutableArray alloc] init];. имеет ли tableview такую же (новую) ссылку на отфильтрованные записи? Если они не находятся в одной и той же области, необходимо будет обновить его ссылку.

3. оба массива заполняются методами вне методов табличного представления, а tableview работает с массивом записей, зачем ему нужна новая ссылка?

4. @AfonsoTsukamoto конечно, мне нужно сделать SELECT * ИЗ таблицы, ГДЕ имя ПОХОЖЕ НА ‘%searchtext%’, поскольку мне нужно использовать% в качестве подстановочного знака sql?

5. @Will, извините, на самом деле не понял вашего вопроса… Но, кстати, вы пытались выполнить NSLog окончательный запрос?