我有一个使用核心数据填充的UITableView&源码。
我想根据数据库表中的属性将部分分组到UITableView中。
例如,如果我在数据库表中有一个名为“type”的类别字段,那么将该数据分割出来的最佳方法是什么?
我见过使用数组的例子,但我对核心数据感到困惑。所有数据当前都是从数据库中显示的,我想以某种方式对其进行分区。
提前感谢。
答案 0 :(得分:2)
如果您使用NSFetchedResultsController来获取结果并将它们连接到您的UI,则非常简单。只需将sectionNameKeyPath:
来电的initWithFetchRequest
参数设置为NSFetchedResultsController
。
在这个例子中,只是从NSFetchedResultsController的类引用中稍作修改,我已经定义了一个键路径,它将使用名为“group”的部分作为节标题。因此,如果数据库中的行具有设置为“Cats”的组,而其他行的组设置为“Dogs”,则生成的表视图将包含2个部分 - 一个用于猫,一个用于狗。
NSManagedObjectContext *context = <#Managed object context#>;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Configure the request's entity, and optionally its predicate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"<#Sort key#>" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];
NSFetchedResultsController *controller = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest
managedObjectContext:context
sectionNameKeyPath:@"groups"
cacheName:@"<#Cache name#>"];
[fetchRequest release];
NSError *error;
BOOL success = [controller performFetch:&error];
有关密钥路径的更多信息,您必须在Xcode文档集中搜索密钥路径文档。但是对于简单的情况,它只是返回对象的属性名称。
答案 1 :(得分:1)
我发现一个数组在使用节时非常有用。看看我的示例代码
排序好友(来自CoreData)
NSMutableArray* unsortedFriends = [appDelegate.core.serviceManager.storageManager getFriendList];
for(ELMUser* user in unsortedFriends) {
if ([user.friendshipConfirmed boolValue]) {
if (![user.localDeleted boolValue]) {
[friendList addObject:user];
}
} else {
if (![user.localDeleted boolValue]) {
[friendListUnconfirmed addObject:user];
}
}
}
listOfItems = [[NSMutableArray alloc] init];
[listOfItems addObject:friendList];
[listOfItems addObject:friendListUnconfirmed];
显示单元格
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
NSMutableArray *subArray = [listOfItems objectAtIndex:indexPath.section];
ELMUser* user = (ELMUser*)[subArray objectAtIndex:indexPath.row];
....