使用多个值对核心数据进行排序

时间:2014-07-08 07:06:04

标签: objective-c core-data nssortdescriptor

我拥有存储在Core Data中的品牌列表,每个品牌都与多个内容相关联。内容有一个名为downStatus的标志,用于表示是否下载了内容。以下方法用于从按品牌名称

排序的Core数据中获取所有品牌
-(void)getDownloadedBrands{

AppDelegate *aAppDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;

NSMutableArray *aBrands = [[NSMutableArray alloc] init];


NSEntityDescription *entity =
[NSEntityDescription entityForName:@"Brand" inManagedObjectContext:aAppDelegate.managedobjectcontext];
 NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];

NSSortDescriptor *sort=[[NSSortDescriptor alloc]initWithKey:@"brandName" ascending:YES];
//NSSortDescriptor *sort1=[[NSSortDescriptor alloc]initWithKey:@"downStatus" ascending:YES];

[request setSortDescriptors:[NSArray arrayWithObjects:sort, nil]];

aBrands =(NSMutableArray *)[aAppDelegate.managedobjectcontext executeFetchRequest:request error:nil];
[request release];
[sort release];
NSLog(@"%@",aBrands);

brands = [[NSMutableArray alloc]initWithArray:aBrands];

aAppDelegate.dbBrandArr = brands;

[self loadGridView];

}

现在我想使用内容中的downStatus进行排序。因此,按照字母顺序下载品牌,然后按字母顺序下载未下载的品牌。对于未下载的downStatus,下载的1需要0两个值{{1}}。请帮忙。

2 个答案:

答案 0 :(得分:1)

实现此目的的一种方法是使用2 fetchRequests使用值NSPredicate属性并使用相同的字母1/0 on downStatussortDescriptor发送到CoreData。

现在通过将0数组添加到1数组来创建新数组。在您的代码中,它看起来像这样:

-(void)getDownloadedBrands{
    AppDelegate *aAppDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;

    //2 arrays
    NSMutableArray *aBrands0 = [[NSMutableArray alloc] init];
    NSMutableArray *aBrands1 = [[NSMutableArray alloc] init];
    //set entity en make requests
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Brand" inManagedObjectContext:aAppDelegate.managedobjectcontext];
    NSFetchRequest *request0 = [[NSFetchRequest alloc] init];
    NSFetchRequest *request1 = [[NSFetchRequest alloc] init];
    [request0 setEntity:entity];
    [request1 setEntity:entity];
    //create sortDescriptor alphabetically
    NSSortDescriptor *sort=[[NSSortDescriptor alloc]initWithKey:@"brandName" ascending:YES];
    //create predicates on downStatus property
    NSPredicate *predicate0 = [NSPredicate predicateWithFormat:@"downStatus == %@", [NSNumber numberWithBool:0]];
    NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"downStatus == %@", [NSNumber numberWithBool:1]];
    //set predicates to the requests
    [request0 setPredicate:predicate0];
    [request1 setPredicate:predicate1];
    //set sortDescriptor to both requests
    [request0 setSortDescriptors:[NSArray arrayWithObjects:sort, nil]];
    [request1 setSortDescriptors:[NSArray arrayWithObjects:sort, nil]];
    //fetch arrays with downStatus 1/0
    aBrands0 =(NSMutableArray *)[aAppDelegate.managedobjectcontext executeFetchRequest:request0 error:nil];
    aBrands1 =(NSMutableArray *)[aAppDelegate.managedobjectcontext executeFetchRequest:request1 error:nil];
    //release requests // NOT USING ARC??
    [request0 release];
    [request1 release];
    [sort release];
    //log results
    NSLog(@"aBrands0: %@",aBrands0);
    NSLog(@"aBrands1: %@",aBrands1);
    //add object 0 array to 1 array
    NSArray *combinedArray = [aBrands1 arrayByAddingObjectsFromArray:aBrands0];
    //copy array to brands
    brands = [[NSMutableArray alloc]initWithArray:combinedArray];
    //set property on appDelegate
    aAppDelegate.dbBrandArr = brands;
    //reload tableView
    [self loadGridView];
}

- 编辑,使用downStatus键为NSDictionary添加答案

-(void)getDownloadedBrands{
    AppDelegate *aAppDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;

    NSMutableArray *aBrands = [[NSMutableArray alloc] init];


    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Brand" inManagedObjectContext:aAppDelegate.managedobjectcontext];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entity];

    NSSortDescriptor *sort=[[NSSortDescriptor alloc]initWithKey:@"brandName" ascending:YES];
    //NSSortDescriptor *sort1=[[NSSortDescriptor alloc]initWithKey:@"downStatus" ascending:YES];

    [request setSortDescriptors:[NSArray arrayWithObjects:sort, nil]];

    aBrands =(NSMutableArray *)[aAppDelegate.managedobjectcontext executeFetchRequest:request error:nil];

    NSMutableArray *aBrands0 = [[NSMutableArray alloc] init];
    NSMutableArray *aBrands1 = [[NSMutableArray alloc] init];
    for (NSDictionary *dict in aBrands) {
        if ([dict valueForKeyPath:@"downStatus"] == YES)
        {
            //add to 1 array
            [aBrands1 addObject:dict];
        }
        else
        {
            //add to 0 array
            [aBrands0 addObject:dict];
        }
    }

    //sort arrays
    NSArray * array1 = [aBrands1 sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];
    NSArray * array0 = [aBrands0 sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];
    NSArray * allArray = [aBrands1 arrayByAddingObjectsFromArray:aBrands0];

    //combine arrays

    //copy array to brands
    brands = [[NSMutableArray alloc]initWithArray:combinedArray];
    //set property on appDelegate
    aAppDelegate.dbBrandArr = brands;
    //reload tableView
    [self loadGridView];

    [request release];
    [sort release];
    NSLog(@"%@",aBrands);
}

答案 1 :(得分:0)

如果您打算在UITableViewController中使用获取结果,则可以使用fetchedResultsController的sectionNameKeyPath作为downStatus,并保留品牌名称的排序描述符。可以这样:

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext
sectionNameKeyPath:@"customSectionTitle" cacheName:nil];

将其放在NSManagedObject的头文件中:

-(NSString*)customSectionTitle;

这是在.m:

-(NSString*)customSectionTitle{
    if ([downStatus boolValue] == YES) {
        return @"Downloaded";
    }
    else {return @"Not Downloaded";}
}

如果您不打算使用fetchedResultsController,请先按downStatus排序,然后按品牌名称排序。