我使用sqlite和fmdb包装器为iphone创建了一个数据库。
数据库中大约有3500行。它有14列:1表示id,1表示名称/主搜索词,9列表示备用搜索词,3列表示简短说明。
我的应用程序的第一个视图只是一个显示搜索栏的介绍性屏幕,有点像谷歌。实现搜索栏后,它将带您进入包含具有所需结果的表的另一个视图。在视图之间的初始转换中有1或2秒的延迟。此外,该表不允许无缝滚动。最后,当您选择一个表格单元格时,它会无缝地显示最终视图,但是当您尝试返回到表格视图时,还会有另外1或2秒的延迟。
我使用较小的数据库运行此应用程序,该数据库有3500行但只有5列。在这种情况下,将从数据库中删除9个备用搜索项。当我在iphone上运行这样的应用程序时,效率相当高......有一点延迟,但实际上并不明显......我可能不会接受延迟,(我只会有假设小延迟是正常的,如果我使用的数据库不是那么明显。
我得出结论,sqlite数据库需要一些调整,因此,我有两个主要问题。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString * CellIdentifier = @“CustomCell”;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
Data *data = [[[DataController instance]filterDataWithName:searchString:searchString:searchString:searchString:searchString:searchString:searchString:searchString:searchString:searchString]objectAtIndex:indexPath.row];
cell.textLabel.text = data.aDataName;
cell.detailTextLabel.text = data.aDataStatus;
// Configure the cell.
return cell;
}
-(NSMutableArray*)filterDataWithName:(NSString*)aDataName:(NSString*)altSearchTermA:(NSString*)altSearchTermB:(NSString*)altSearchTermC:(NSString*)altSearchTermD:(NSString*)altSearchTermE:(NSString*)altSearchTermF:(NSString*)altSearchTermG:(NSString*)altSearchTermH:(NSString*)altSearchTermI;
{
if ((aDataName && [aDataName length] > 0) && (altSearchTermA && [altSearchTermA length] > 0) && (altSearchTermB && [altSearchTermB length] > 0) && (altSearchTermC && [altSearchTermC length] > 0) && (altSearchTermD && [altSearchTermD length] > 0) && (altSearchTermE && [altSearchTermE length] > 0) && (altSearchTermF && [altSearchTermF length] > 0) && (altSearchTermG && [altSearchTermG length] > 0) && (altSearchTermH && [altSearchTermH length] > 0) && (altSearchTermI && [altSearchTermI length] > 0))
{
NSMutableArray *filterDataArray = [[NSMutableArray alloc]initWithArray:dataList];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(aDataName CONTAINS[cd] %@) OR (altSearchTermA CONTAINS[cd] %@) OR (altSearchTermB CONTAINS[cd] %@) OR (altSearchTermC CONTAINS[cd] %@) OR (altSearchTermD CONTAINS[cd] %@) OR (altSearchTermE CONTAINS[cd] %@) OR (altSearchTermF CONTAINS[cd] %@) OR (altSearchTermG CONTAINS[cd] %@) OR (altSearchTermH CONTAINS[cd] %@) OR (altSearchTermI CONTAINS[cd] %@)", aDataName, altSearchTermA,altSearchTermB,altSearchTermC,altSearchTermD,altSearchTermE,altSearchTermF,altSearchTermG,altSearchTermH,altSearchTermI];
[filterDataArray filterUsingPredicate:predicate];
return filterDataArray;
}
else
{
return dataList;
}
}
答案 0 :(得分:1)
为每个创建的单元格调用cellForRowAtIndexPath,因此正在为每个单元格/行调用filterDataWithName函数。
在其他地方调用你的filterDataWithName,只需在cellForRowAtIndexPath中使用NSMutableArray,例如
cell.textLabel.text = [[filterDataArray objectAtIndex:indexpath.row] data.aDataName];
答案 1 :(得分:0)
好的 - 我错过了Darren提到的上述问题 - 如果这不能解决它.....我遇到了类似的问题,我需要在桌面上进行详尽的搜索。您可以尝试使用类似的内容将查询限制为一行。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
Level2CustomCell *cell = (Level2CustomCell*) [tableView dequeueReusableCellWithIdentifier:kCellIdentifier];
if (cell == nil)
{
cell = [[[Level2CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellIdentifier] autorelease];
cell.accessoryType = UITableViewCellAccessoryNone;
}
// SEARCH ENGINE TIME
NSString *likeTitle = [NSString stringWithFormat:@" TITLE LIKE '%@%@%@'",@"%",msgView.searchBar.text,@"%"];
NSString *likeSearch = [NSString stringWithFormat:@" SORT4='%@' AND SEARCH LIKE '%@%@%@'",selectedSection,@"%",msgView.searchBar.text,@"%"];
NSString *likeAddress = [NSString stringWithFormat:@" SORT4='%@' AND ADDRESS LIKE '%@%@%@'",selectedSection,@"%",msgView.searchBar.text,@"%"];
NSString *likeContent = [NSString stringWithFormat:@" SORT4='%@' AND CONTENT LIKE '%@%@%@'",selectedSection,@"%",msgView.searchBar.text,@"%"];
qry = [NSString stringWithFormat: @"select * from SPOT_INFO WHERE SORT4 = '%@' AND %@ OR %@ OR %@ OR %@ order by TITLE limit 1 offset %d",selectedSection,likeTitle,likeSearch,likeAddress,likeContent,[indexPath row]];
DLog(@"qry :%@",qry);
FMResultSet *rs = [appDelegate.userdb executeQuery:qry];
if ([rs next]) {
NSString *title = [rs stringForColumn:@"TITLE"];
DLog(@"title %@",title);
NSString *content = [rs stringForColumn:@"CONTENT"];
NSString *imgFileName = [rs stringForColumn:@"IMG_NAME"];
}
[rs close];
}
我推荐egodatabase,它具有非阻塞gcd(大中央调度)代码 https://github.com/jdp-global/egodatabase