CoreData 和 UITableView:在单元格中显示值
Posted
技术标签:
【中文标题】CoreData 和 UITableView:在单元格中显示值【英文标题】:CoreData and UITableView: display values in cells 【发布时间】:2013-03-05 14:45:54 【问题描述】:我正在使用 Core Data 和 Web 服务,我想将我的数据添加到我的表中, 但我不知道该怎么称呼他们,请你帮帮我,因为当我使用这种方式时它不起作用。
这是我在 HTTP 类中更新数据库的方法
- (void)updateLocalCardsDataBase:(NSArray*) cardsArray
//check if current user has cards in local database
NSManagedObjectContext* managedObjectContext = [(AppDelegate*) [[UIApplication sharedApplication] delegate] managedObjectContext];
for(NSDictionary *cardDic in cardsArray)
Card *card = [NSEntityDescription insertNewObjectForEntityForName:@"Card" inManagedObjectContext:managedObjectContext];
card.remote_id = [NSNumber numberWithInt:[[cardDic objectForKey:@"id"] intValue]];
card.stampNumber = [NSNumber numberWithInt:[[cardDic objectForKey:@"stampNumber"] intValue]];
card.createdAt = [NSDate dateWithTimeIntervalSince1970:[[cardDic objectForKey:@"createdAt"] intValue]];
[managedObjectContext lock];
NSError *error;
if (![managedObjectContext save:&error])
NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
NSLog(@"Failed to save to data store: %@", [error localizedDescription]);
NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
if(detailedErrors != nil && [detailedErrors count] > 0)
for(NSError* detailedError in detailedErrors)
NSLog(@" DetailedError: %@", [detailedError userInfo]);
else
NSLog(@" %@", [error userInfo]);
[managedObjectContext unlock];
这是我的桌子:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
// NSManagedObjectContext* managedObjectContext = [(AppDelegate*) [[UIApplication sharedApplication] delegate] managedObjectContext];
static NSString *CellIdentifier = @"CardsCell";
CardCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
NSArray *objects = [[NSBundle mainBundle] loadNibNamed:@"CardCell" owner:nil options:nil];
for (id currentObject in objects)
if([currentObject isKindOfClass:[UITableViewCell class]])
cell = (CardCell *) currentObject;
break;
NSDictionary *f = [_cards objectAtIndex:indexPath.row];
cell.stampId.text = [f objectForKey:@"stampNumber"];
NSLog(@"%@fdssfdfddavds",[f objectForKey:@"stampNumber"]);
cell.createdAt.text = [f objectForKey:@"createdAt"];
cell.CardId.text = [f objectForKey:@"id"];
return cell;
编辑:
我的问题是如何在 UITableView
中显示数据
【问题讨论】:
有什么问题?您是在问如何获取 Core Data 对象的列表? @MikeD 我想在 uitableview 中显示我的 stampId、createdAt、CardId 但我不知道如何 你如何填充_cards
?
@MikeD 这是我的问题,我想我必须使用 fetched
是的。您已使用 fetch 请求。
【参考方案1】:
调用[tableView reloadData]
之前,需要先获取数据源。您将获得一组数据模型,不是NSDictionary
。您可以将我的示例方法(或最适合您的变体)放置在最适合您需求的地方,但是这个方法不会过滤或排序模型,它只会获取所有模型。另外,我会将方法放在存储表格视图的视图控制器中:
-(NSArray*)getMycards
NSManagedObjectContext *context = [(AppDelegate*) [[UIApplication sharedApplication] delegate] managedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Card" inManagedObjectContext:context];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
NSError *error;
[request setEntity:entityDescription];
NSArray *cards = [context executeFetchRequest:request error:&error];
// now check if there is an error and handle it appropriatelty
// I usually return 'nil' but you don't have if you don't want
if ( error != nil )
// investigate error
return cards;
我建议在放置表格的视图控制器中创建一个属性@property NSArray *cards
,这样会更容易管理。我做了一个假设(因为我没有关于您的视图控制器的其他信息,所以在您的视图控制器的头文件 (@property UITableView *tableView;
) 中声明了一个名为“tableView”的属性,根据需要调整命名。
使用上述方法,当您想在加载表数据之前填充数组时:
// you put this block of code anywhere in the view controller that also has your table view
// likely in 'viewDidLoad' or 'viewDidAppear'
// and/or anywhere else where it makes sense to reload the table
self.cards = [self getMyCards];
if ( self.cards.count > 0 )
[self.tableview reloadData];
else
// maybe display an error
现在,您的cellForRowAtIndexPath
应该是这样的
-(UITableViewCell*tableView:tableView cellForRowAtIndexPath
UITbaleViewCell *cell = ...;
// creating the type of cell seems fine to me
.
.
.
// keep in mind I don't know the exact make up of your card model
// I don't know what the data types are, so you will have to adjust as necessary
Card *card = self.cards[indexPath.row];
cell.stampId.text = [[NSString alloc] initWithFormat:@"%@",card.stamp];
cell.createdAt.text = [[NSString alloc] initWithFormat:@"%@",card.createdAt];
// you might want format the date property better, this might end being a lot more than what you want
cell.CardId.text = [[NSString alloc] initWithFormat:@"%@",card.id];
return cell;
Core Data 非常强大,我强烈推荐Core Data overview,其次是Core Data Programming Guide。
【讨论】:
谢谢 我应该把 self.cards = [someclass getMyCards]; if (self.cards.count > 0) [self.tableview reloadData]; else // 可能会显示错误 ? @adam 更新了该部分 @Miek D 再次感谢您的帮助,我对此部分仍有疑问:self.cards = [someclass getMyCards]; if (self.cards.count > 0) [self.tableview reloadData]; else // 可能会显示一个错误 这部分是什么意思 -> someclass 并且我对这个 self.tableview 有错误,因为我使用了 ViewController 类 @adam 已更新。 'someClass' 意味着你可以将获取请求放在任何你想要的地方,我改变了,所以它在你的视图控制器中。我假设您将表格视图存储在名为tableView
的属性中。您可以根据需要调整命名。
我可以将我的 Fetches 员工放入 -(void) updateLocalCardsDataBase:(NSArray*) cardsArray 方法中吗?以上是关于CoreData 和 UITableView:在单元格中显示值的主要内容,如果未能解决你的问题,请参考以下文章
使用 coredata 在 UITableView 中添加 ABMultiValue Cell
UITableView 和 CoreData - 在特定行和效率中显示数据?
在 UITableView 中显示 CoreData 对象在 Set 中排序
在 coredata 中加载图像时 UITableView 滞后
使用 NSFetchedResultsController 时 CoreData 与 UITableView 有啥关系?