UITableView分组部分

时间:2010-08-24 22:03:12

标签: iphone sqlite core-data uitableview

我有一个使用核心数据填充的UITableView&源码。

我想根据数据库表中的属性将部分分组到UITableView中。

例如,如果我在数据库表中有一个名为“type”的类别字段,那么将该数据分割出来的最佳方法是什么?

我见过使用数组的例子,但我对核心数据感到困惑。所有数据当前都是从数据库中显示的,我想以某种方式对其进行分区。

提前感谢。

2 个答案:

答案 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];

....