#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 окончательный запрос?