如何在tableview中显示数据库中的所有行

时间:2011-11-16 09:36:51

标签: iphone database uitableview

我使用此代码显示数据库中的所有行,但是当tableview加载时,只显示最后一行..我做错了什么。请帮忙!!

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext];

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];

NSError *error;
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];

if (!mutableFetchResults)
{
    NSLog(@"Cant Fetch");
}

//compare fetched data with user input abd login if match
for(Event *ev in mutableFetchResults)
{
    NSString *cellValue=[ev VidField];
    NSString *cellValue1=[ev ImgField];
    NSLog(@"%@",cellValue);
    NSLog(@"%@",cellValue1);
    [cell.textLabel setText:cellValue];
    cell.image = [UIImage imageNamed:cellValue1];
}
return cell;

}

5 个答案:

答案 0 :(得分:0)

此代码重复地为同一个cell实例设置不同的值,因此最终将设置为获取结果中的最后一个事件。您的cellForRowAtIndexPath方法应该使用indexPath.row来设置mutableFetchResults中特定事件的单元格值 - 如果这是一个数组,它将类似于:

Event *ev = [mutableFetchResults objectAtIndex:indexPath.row];
NSString *cellValue=[ev VidField];         
NSString *cellValue1=[ev ImgField];         
NSLog(@"%@",cellValue);         
NSLog(@"%@",cellValue1);         
[cell.textLabel setText:cellValue];         
cell.image = [UIImage imageNamed:cellValue1];
return cell;

如果没有看到更多代码,很难提供更多细节,但这应该让你走上正确的道路。

答案 1 :(得分:0)

你应该这样做;

<。>在.h文件中;

NSMutableArray *myFetchResults;
<。>在.m文件中;

-(void)getAllDataFromDatabase{ // call it to get data
   myFetchResults = [[NSMutableArray alloc] init];
   //database connection codes
   myFetchResults = mutableFetchResults; // now you have an array with all objects.
}

in UITableView cellForRowAtIndexPath delegate method:
{
  Event *ev = (Event*)[myFetchResults objectAtindex:indexPath.row];
  cell.textLabel.Text = [ev VidField];
  cell.image = [UIImage imageNamed:[ev ImgField]];
}

我认为这会奏效。

答案 2 :(得分:0)

您只是覆盖了cell.textLabel中的值。如果您的for循环展开,它将看起来像这样:

cell.textLabel = row1Text
cell.textLabel = row2Text
...
cell.textLabel = rowNText 

您应该使用– tableView:cellForRowAtIndexPath:indexPath.row中设置单元格文字,以选择所需的记录。

答案 3 :(得分:0)

你应该使用if(Condition)。因为,for()迭代直到最后一条记录将被获取并设置记录的数据。

答案 4 :(得分:0)

我认为首先在mutableFetchResults中取走viewdidload,然后保留[mutableFetchResults retain]

然后表格的行数将为[mutableFetchResults count]

然后制作此代码......

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
 cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault    reuseIdentifier:CellIdentifier] autorelease];


}
NSString *cellValue=[indexpath.row VidField];
NSString *cellValue1=[indexpath.row ImgField];
NSLog(@"%@",cellValue);
NSLog(@"%@",cellValue1);
[cell.textLabel setText:cellValue];
cell.image = [UIImage imageNamed:cellValue1];
return cell;
}

如果你不理解任何代码然后告诉我......因为我遇到同样的问题...如果你想看到更多看到我的解决方案.... What will be the numberOfRowsInSection return type for uitableview when XML data is retrieved?