如何添加“加载更多”表格视图选项
我的应用程序有一个由 Sqlite DB 填充的表,其中包含大量数据 所以它会导致表视图中的延迟加载
代码,以便我的表视图在特定的限制时间内从 sqlite DB 加载记录
- (void) searchData {
//i=0;
[newSearchBar setShowsCancelButton:YES animated:YES];
NSLog(@"search data started ");
NSLog(@" checking value %@",newSearchBar.text);
NSString *databaseName = @"imeating.sql";
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString *documentsDir=[documentPaths objectAtIndex:0];
NSString *databasePath=[documentsDir stringByAppendingPathComponent:databaseName];
sqlite3 *database;
if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
{
NSLog(@"with in if sqlite3 open");
// Setup the SQL Statement and compile it for faster access
sqlite3_stmt *compiledStatement ;
const char *sqlStatement ;
/* if ([searchFlag isEqualToString:@"DEF"])
{
sqlStatement = "select subitem_name, subitem_detail_id from subitem_detail limit 200" ;
}
else
{*/
sqlStatement = "select category_id, upper(subitem_name), subitem_detail_id, protein, carbohydrates, fat, calorie from subitem_detail where subitem_name LIKE ? order by subitem_name limit ?,?" ;
NSLog(@"inside search b4 wildsearch %@",searchString);
wildSearch = [NSString stringWithFormat:@"%@%@",searchString, @"%"];
NSLog(@"wildsearch %@",wildSearch);
[newSearchBar setShowsCancelButton:YES animated:YES];
//NSLog(@"inside search : %@", wildSearch);
//}
if (sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK)
{
NSLog(@"with in if sqlite3 prepare v2");
// if (![searchFlag isEqualToString:@"DEF"])
// {
sqlite3_bind_text(compiledStatement, 1, [wildSearch UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_int(compiledStatement, 2, llimit);
sqlite3_bind_int(compiledStatement, 3, ulimit);
// }
// Loop through the results and add it to array
if (llimit <200){
NSLog(@"with in if limit < 200");
itemArray = [[NSMutableArray alloc] init] ;
}
while (sqlite3_step(compiledStatement) == SQLITE_ROW) {
//NSLog(@" while sqlite3 step");
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init] ;
//[itemDic release];
//itemDic = nil ;
itemDic = [[[NSMutableDictionary alloc] init] autorelease];
NSString *categoryId = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
NSString *itemName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
NSString *itemId = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];
NSString *protein = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)];
NSString *carbo = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 4)];
NSString *fat = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 5)];
NSString *calorie = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 6)];
/* NSLog(@"itemname : %@", itemName);
NSLog(@"itemid : %@", itemId);
NSLog(@"\n");*/
[itemDic setObject:categoryId forKey:@"categoryId"];
[itemDic setObject:itemId forKey:@"itemId"];
[itemDic setObject:itemName forKey:@"itemName"];
[itemDic setObject:protein forKey:@"protein"];
[itemDic setObject:carbo forKey:@"carbohydrate"];
[itemDic setObject:fat forKey:@"fat"];
[itemDic setObject:calorie forKey:@"calorie"];
[itemArray addObject:itemDic];
if (ulimit%200 == 0)
{
//activity = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActionSheetStyleDefault];
//[activity startAnimating];
[newTableView reloadData];
//[newSearchBar setShowsCancelButton:YES animated:YES];
//NSLog(@"list all views after 1st reload: %@", [self.navigationController.viewControllers description]);
//[newTableView addSubview:activity];
//[activity stopAnimating];
//[activity release];
//NSLog(@" with in if");
}
[pool drain];
} /*else
{
UIAlertView *alert = [[UIAlertView alloc ] initWithTitle:@"Error" message:@"sqlite rows not returned" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil] ;
[alert show];
}*/
}
} else
{
UIAlertView *alert = [[UIAlertView alloc ] initWithTitle:@"Error" message:@"DataBase Path doesn't exists" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil] ;
[alert show];
}
//NSLog(@"itemArray desc : %@",[itemArray description]);
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
//NSLog(@"Inside number of sections in tableview");
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [itemArray count] ;
}
// Customize the appearance of table view cells.
- (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] autorelease];
}
//NSLog(@"indexpath row val : %d", indexPath.row);
tableIndex = indexPath ;
//NSLog(@"print indexpath row : %d", indexPath.row);
//NSLog(@"print limit : %d", limit);
if (indexPath.row > limit)
{
llimit = llimit+200 ;
ulimit = ulimit+200 ;
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//[opq cancelAllOperations];
NSLog(@"before ns operation");
opq = [NSOperationQueue new];
//opq = [[NSOperationQueue alloc] init];
//[opq setMaxConcurrentOperationCount:2];
// [self performSelectorOnMainThread:@selector(searchData) withObject:nil waitUntilDone:YES];
NSInvocationOperation *op = [[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(searchData) object:nil] autorelease];
[opq addOperation:op];
NSLog(@"after ns operation");
//[op release];
//[opq release];
[pool drain];
i++;
limit = limit + 120 ;
NSLog(@"i=%d",i);
//[cell setText:[[itemArray objectAtIndex:indexPath.row] valueForKey:@"itemName"]];
}
// Configure the cell.
//[cell setText:[[itemArray objectAtIndex:indexPath.row] valueForKey:@"itemName"]];
cell.textLabel.text = [[itemArray objectAtIndex:indexPath.row] valueForKey:@"itemName"] ;
NSString *pval, *cval, *fval, *cal ;
if ([[[itemArray objectAtIndex:indexPath.row] valueForKey:@"protein"] length] <= 5)
pval = [[itemArray objectAtIndex:indexPath.row] valueForKey:@"protein"];
else
pval = [[[itemArray objectAtIndex:indexPath.row] valueForKey:@"protein"] substringWithRange:NSMakeRange(0, 5)];
if ([[[itemArray objectAtIndex:indexPath.row] valueForKey:@"carbohydrate"] length] <= 5)
cval = [[itemArray objectAtIndex:indexPath.row] valueForKey:@"carbohydrate"];
else
cval = [[[itemArray objectAtIndex:indexPath.row] valueForKey:@"carbohydrate"] substringWithRange:NSMakeRange(0, 5)];
if ([[[itemArray objectAtIndex:indexPath.row] valueForKey:@"fat"] length] <= 5)
fval = [[itemArray objectAtIndex:indexPath.row] valueForKey:@"fat"];
else
fval = [[[itemArray objectAtIndex:indexPath.row] valueForKey:@"fat"] substringWithRange:NSMakeRange(0, 5)];
if ([[[itemArray objectAtIndex:indexPath.row] valueForKey:@"calorie"] length] <= 5)
cal = [[itemArray objectAtIndex:indexPath.row] valueForKey:@"calorie"];
else
cal = [[[itemArray objectAtIndex:indexPath.row] valueForKey:@"calorie"] substringWithRange:NSMakeRange(0, 5)];
cell.detailTextLabel.text =
[NSString stringWithFormat:@"Prot: %@ Carb: %@ Fat: %@ Cal: %@", pval, cval, fval, cal] ;
return cell;
}
这是我需要在行中“加载更多”按钮的
My App is having a table which is populated by Sqlite DB contains huge amount of data
So it causes lazy loading in the table view
Here is the code
- (void) searchData {
//i=0;
[newSearchBar setShowsCancelButton:YES animated:YES];
NSLog(@"search data started ");
NSLog(@" checking value %@",newSearchBar.text);
NSString *databaseName = @"imeating.sql";
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString *documentsDir=[documentPaths objectAtIndex:0];
NSString *databasePath=[documentsDir stringByAppendingPathComponent:databaseName];
sqlite3 *database;
if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
{
NSLog(@"with in if sqlite3 open");
// Setup the SQL Statement and compile it for faster access
sqlite3_stmt *compiledStatement ;
const char *sqlStatement ;
/* if ([searchFlag isEqualToString:@"DEF"])
{
sqlStatement = "select subitem_name, subitem_detail_id from subitem_detail limit 200" ;
}
else
{*/
sqlStatement = "select category_id, upper(subitem_name), subitem_detail_id, protein, carbohydrates, fat, calorie from subitem_detail where subitem_name LIKE ? order by subitem_name limit ?,?" ;
NSLog(@"inside search b4 wildsearch %@",searchString);
wildSearch = [NSString stringWithFormat:@"%@%@",searchString, @"%"];
NSLog(@"wildsearch %@",wildSearch);
[newSearchBar setShowsCancelButton:YES animated:YES];
//NSLog(@"inside search : %@", wildSearch);
//}
if (sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK)
{
NSLog(@"with in if sqlite3 prepare v2");
// if (![searchFlag isEqualToString:@"DEF"])
// {
sqlite3_bind_text(compiledStatement, 1, [wildSearch UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_int(compiledStatement, 2, llimit);
sqlite3_bind_int(compiledStatement, 3, ulimit);
// }
// Loop through the results and add it to array
if (llimit <200){
NSLog(@"with in if limit < 200");
itemArray = [[NSMutableArray alloc] init] ;
}
while (sqlite3_step(compiledStatement) == SQLITE_ROW) {
//NSLog(@" while sqlite3 step");
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init] ;
//[itemDic release];
//itemDic = nil ;
itemDic = [[[NSMutableDictionary alloc] init] autorelease];
NSString *categoryId = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
NSString *itemName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
NSString *itemId = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];
NSString *protein = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)];
NSString *carbo = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 4)];
NSString *fat = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 5)];
NSString *calorie = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 6)];
/* NSLog(@"itemname : %@", itemName);
NSLog(@"itemid : %@", itemId);
NSLog(@"\n");*/
[itemDic setObject:categoryId forKey:@"categoryId"];
[itemDic setObject:itemId forKey:@"itemId"];
[itemDic setObject:itemName forKey:@"itemName"];
[itemDic setObject:protein forKey:@"protein"];
[itemDic setObject:carbo forKey:@"carbohydrate"];
[itemDic setObject:fat forKey:@"fat"];
[itemDic setObject:calorie forKey:@"calorie"];
[itemArray addObject:itemDic];
if (ulimit%200 == 0)
{
//activity = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActionSheetStyleDefault];
//[activity startAnimating];
[newTableView reloadData];
//[newSearchBar setShowsCancelButton:YES animated:YES];
//NSLog(@"list all views after 1st reload: %@", [self.navigationController.viewControllers description]);
//[newTableView addSubview:activity];
//[activity stopAnimating];
//[activity release];
//NSLog(@" with in if");
}
[pool drain];
} /*else
{
UIAlertView *alert = [[UIAlertView alloc ] initWithTitle:@"Error" message:@"sqlite rows not returned" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil] ;
[alert show];
}*/
}
} else
{
UIAlertView *alert = [[UIAlertView alloc ] initWithTitle:@"Error" message:@"DataBase Path doesn't exists" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil] ;
[alert show];
}
//NSLog(@"itemArray desc : %@",[itemArray description]);
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
//NSLog(@"Inside number of sections in tableview");
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [itemArray count] ;
}
// Customize the appearance of table view cells.
- (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] autorelease];
}
//NSLog(@"indexpath row val : %d", indexPath.row);
tableIndex = indexPath ;
//NSLog(@"print indexpath row : %d", indexPath.row);
//NSLog(@"print limit : %d", limit);
if (indexPath.row > limit)
{
llimit = llimit+200 ;
ulimit = ulimit+200 ;
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//[opq cancelAllOperations];
NSLog(@"before ns operation");
opq = [NSOperationQueue new];
//opq = [[NSOperationQueue alloc] init];
//[opq setMaxConcurrentOperationCount:2];
// [self performSelectorOnMainThread:@selector(searchData) withObject:nil waitUntilDone:YES];
NSInvocationOperation *op = [[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(searchData) object:nil] autorelease];
[opq addOperation:op];
NSLog(@"after ns operation");
//[op release];
//[opq release];
[pool drain];
i++;
limit = limit + 120 ;
NSLog(@"i=%d",i);
//[cell setText:[[itemArray objectAtIndex:indexPath.row] valueForKey:@"itemName"]];
}
// Configure the cell.
//[cell setText:[[itemArray objectAtIndex:indexPath.row] valueForKey:@"itemName"]];
cell.textLabel.text = [[itemArray objectAtIndex:indexPath.row] valueForKey:@"itemName"] ;
NSString *pval, *cval, *fval, *cal ;
if ([[[itemArray objectAtIndex:indexPath.row] valueForKey:@"protein"] length] <= 5)
pval = [[itemArray objectAtIndex:indexPath.row] valueForKey:@"protein"];
else
pval = [[[itemArray objectAtIndex:indexPath.row] valueForKey:@"protein"] substringWithRange:NSMakeRange(0, 5)];
if ([[[itemArray objectAtIndex:indexPath.row] valueForKey:@"carbohydrate"] length] <= 5)
cval = [[itemArray objectAtIndex:indexPath.row] valueForKey:@"carbohydrate"];
else
cval = [[[itemArray objectAtIndex:indexPath.row] valueForKey:@"carbohydrate"] substringWithRange:NSMakeRange(0, 5)];
if ([[[itemArray objectAtIndex:indexPath.row] valueForKey:@"fat"] length] <= 5)
fval = [[itemArray objectAtIndex:indexPath.row] valueForKey:@"fat"];
else
fval = [[[itemArray objectAtIndex:indexPath.row] valueForKey:@"fat"] substringWithRange:NSMakeRange(0, 5)];
if ([[[itemArray objectAtIndex:indexPath.row] valueForKey:@"calorie"] length] <= 5)
cal = [[itemArray objectAtIndex:indexPath.row] valueForKey:@"calorie"];
else
cal = [[[itemArray objectAtIndex:indexPath.row] valueForKey:@"calorie"] substringWithRange:NSMakeRange(0, 5)];
cell.detailTextLabel.text =
[NSString stringWithFormat:@"Prot: %@ Carb: %@ Fat: %@ Cal: %@", pval, cval, fval, cal] ;
return cell;
}
I need "load more" button in the row for my table view to load records from sqlite DB in particular period of limit
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
将部分中的行数添加 + 1:
然后在 cellforrowatindexpath 中,查看 indexPath.row 是否大于 [itemArray count]。如果是,则将文本“加载更多...”作为该单元格的标题。
在didSelectRowAtIndexPath中,查看indexPath.row是否等于[itemArray count]。如果是这种情况,则向 itemArray 添加 x 个结果,然后调用 [tableView reloadData]。
对于某些 UI 改进,您可以在表视图顶部添加 UIActivityIndicator 以显示后台正在进行某些处理。
Add a + 1 to the numbers of rows in section:
Then in the cellforrowatindexpath, see if the indexPath.row is bigger than [itemArray count]. If it is, then put the text "Load more..." as that cell's title.
In the didSelectRowAtIndexPath, see if the indexPath.row is equal to [itemArray count]. If that is the case, then add x more results to the itemArray and then call [tableView reloadData].
For some UI improvement you can add a UIActivityIndicator on top of the table view to show that some processing is going on in the background.