2011-05-05 50 views
7

我的應用程序具有通過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; 
} 

我需要「加載更多」我的表視圖,從sqlite的DB加載記錄限制的特定時期

回答

4

添加+ 1行的數量在部分行中的按鈕:

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

} 
  • 然後在的cellForRowAtIndexPath,查看是否indexPath.row比[itemArray計數]更大。如果是,則將文本「加載更多...」作爲單元格的標題。

  • 在didSelectRowAtIndexPath方法中,查看是否indexPath.row等於[itemArray計數。如果是這種情況,那麼向itemArray添加更多的結果,然後調用[tableView reloadData]。

  • 對於一些UI的改進,你可以在表格視圖頂部添加UIActivityIndi​​cator表明一些處理在後臺繼續。

+0

嗨其實我不知道如何更改上面的事件,你已經給編輯sqlite查詢如果可能可以編輯我的代碼我已經給我的問題..你可以電話我們我如何,如果我當以前在搜索bar..if它選擇的數據上 – Ramz 2011-05-06 04:53:55

+0

安德烈其工作partially..how點擊我可以刪除該負載更多選項中的加載更多按鈕將工作有二硝基甲苯要加載更多... – Ramz 2011-05-06 11:38:06

+0

@Ramkumar:我不明白你最後的問題。你想做什麼? – Andrei 2011-05-06 12:39:06