2011-05-05 9 views
7

Mi aplicación es tener una tabla que está poblada por SQLite DB contiene gran cantidad de datos esto ocasiona que la carga diferida en la vista de tabla¿Cómo puedo añadir "carga más" opción de vista de tabla

Este es el código

- (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; 
} 

necesito botón "cargar más" en la fila para mi vista de tabla para cargar los registros de SQLite DB, en particular período de límite de

Respuesta

4

Añadir a + 1 para el número de filas en la sección:

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

} 
  • Luego, en el cellForRowAtIndexPath, ver si el indexPath.row es más grande que [recuento ItemArray]. Si es así, coloque el texto "Cargar más ..." como el título de esa celda.

  • En el didSelectRowAtIndexPath, ver si el indexPath.row es igual a [recuento ItemArray]. Si ese es el caso, agregue x más resultados a itemArray y luego llame a [tableView reloadData].

  • Para obtener alguna mejora en la UI, puede agregar un UIActivityIndicator en la parte superior de la vista de tabla para mostrar que se está procesando algo en segundo plano.

+0

hola no sé cómo puedo cambiar las consultas de sqlite en los eventos anteriores que usted ha dado para editar ... si es posible, puede editar mi código que he dado en mi pregunta ... y puede saber cómo funcionará el botón Cargar más si hago clic en – Ramz

+0

Andrei funciona parcialmente ... ¿Cómo puedo eliminar esta opción de carga más cuando los datos seleccionados previamente en la barra de búsqueda ... si está allí no queremos cargar más ... – Ramz

+0

@Ramkumar: No entiendo tu última pregunta. ¿Que estás tratando de hacer? – Andrei

Cuestiones relacionadas