如何添加“加载更多”表格视图选项

发布于 2024-11-05 03:35:24 字数 8902 浏览 0 评论 0原文

我的应用程序有一个由 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

三五鸿雁 2024-11-12 03:35:24

将部分中的行数添加 + 1:

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

}
  • 然后在 cellforrowatindexpath 中,查看 indexPath.row 是否大于 [itemArray count]。如果是,则将文本“加载更多...”作为该单元格的标题。

  • 在didSelectRowAtIndexPath中,查看indexPath.row是否等于[itemArray count]。如果是这种情况,则向 itemArray 添加 x 个结果,然后调用 [tableView reloadData]。

  • 对于某些 UI 改进,您可以在表视图顶部添加 UIActivityIndi​​cator 以显示后台正在进行某些处理。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文