Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I add "load more" option to table view

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

like image 473
Ramz Avatar asked May 05 '11 13:05

Ramz


1 Answers

Add a + 1 to the numbers of rows in section:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [itemArray count] + 1;

}
  • 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.

like image 172
Alex Avatar answered Sep 20 '22 20:09

Alex