排序/筛选NSFetchRequest怎么写排序描述符taht将使用当前的日期?(Sort/Filt

2019-10-20 06:18发布

我存储在Core Data 2日期属性,一个是到期日期和第二为“琥珀色”日期(即X周之前到期日期的日期)。 我想在下面的方式对结果进行排序:

  • 琥珀日期之前的项目 - (绿色)现在<琥珀
  • 琥珀日期之后的项目,但之前到期日期 - (琥珀色)琥珀<现在= <到期
  • 现在(红色)到期<= - 上或之后的项目到期日期

你能帮助我吗?

更新的详细研究后,我发现,我可以取未排序的结果,把它在阵列中和阵列进行排序,并表将使用这个数组作为数据源-太多地改变有它在我的应用程序工作。 也有可能使用基于上述名单将举行评估值额外的参数。 取指令,然后将需要2个步骤:

  1. 获取数据,并在每个项目上运行评估
  2. 通过此评估属性获取排序数据

后者的解决方案是我最好的选择,所以任何人都可以帮助我的那部分?

编辑

state属性被定义为int16_t

@property (nonatomic, assign) int16_t state;

viewDidLoad与表视图的我称之为休耕获取排序结果之前:

 NSFetchRequest *fetchRequest = 
[NSFetchRequest fetchRequestWithEntityName:@"MyTable"];
    NSSortDescriptor *sortTitle = 
    [NSSortDescriptor sortDescriptorWithKey:@"name"
                                  ascending:YES];
    [fetchRequest setSortDescriptors:@[sortByTitle]];

    NSFetchedResultsController *ctrl = [[NSFetchedResultsController alloc]
                initWithFetchRequest:fetchRequest
                managedObjectContext:[NSManagedObjectContext defaultContext]
                  sectionNameKeyPath:nil
                           cacheName:nil];

    NSError* fetchError = nil;
    if([ctrl performFetch:&fetchError] == NO) {

        NSLog(@"Error: perform fetch failed, %@",[fetchError description]);

    } else {
        //do we have results here?
        id <NSFetchedResultsSectionInfo> sectionInfo = 
                                      [ctrl.sections objectAtIndex:0];
        NSArray * items = [sectionInfo objects];
        for (int i=0; i<items.count; i++) {
            CourseCD* item = items[i];
            NSLog(@"%d - %@",i,item);
            [item evaluateState];//category adds this method
        }
    }

这是从类别中的方法

-(State) evaluateState {
    CourseComplianceState pState = StateUnknown;
    if (self.expire == nil) {
        [self setState:pState];
        return pState;
    }

    NSDate* now = [[NSDate alloc] init];
    pState = StateNotExpired;

    if ([NSDate isDate:now inRangeFirstDate:self.thresholdDate 
              lastDate:self.expireDate]) {
        //amber
        pState = StateWithinThreshold;
    } else if ([NSDate isDate:now inRangeFirstDate:self.expireDate 
                     lastDate:[NSDate distantFuture]]){
        //expired
        pState = StateExpired;
    }

    //
    [self setState:pState];

    NSLog(@" - evaluateState -");

    return pState;
}

这是国家结构

enum {
    StateUnknown,
    StateNotExpired,
    StateWithinThreshold,
    StateExpired

};
typedef int16_t State;

然后这个电话后我用下面的各种目的地通话和我使用的控制器,与表的工作原理。

//later I use following sort descriptors
NSSortDescriptor *sortState = [NSSortDescriptor 
                                  sortDescriptorWithKey:@"state"
                                              ascending:YES];
NSSortDescriptor *sortExpire = [NSSortDescriptor 
                                  sortDescriptorWithKey:@"expire"
                                              ascending:YES];

编辑

NSSortDescriptor *sortByTitle = [NSSortDescriptor 
                                   sortDescriptorWithKey:@"name" 
                                               ascending:YES];
NSFetchRequest *fetchRequest = [NSFetchRequest 
                                 fetchRequestWithEntityName:@"Course"];
[fetchRequest setSortDescriptors:@[sortState,sortExpire,sortByTitle]];


self.resultsController = [[NSFetchedResultsController alloc] 
                           initWithFetchRequest:fetchRequest
                   managedObjectContext:[NSManagedObjectContext defaultContext]
                             sectionNameKeyPath:nil
                                      cacheName:nil];

self.resultsController.delegate = self;

NSError* fetchError = nil;
if([self.resultsController performFetch:&fetchError] == NO) {

    NSLog(@"Error: perform fetch failed, %@",[fetchError description]);

}

但它只能通过各种各样的到期日期和状态会被忽略或不受此一次评估运行保存。

编辑2014年6月10日

这是NSManagedObject类的setter

//.h
@property (nonatomic, assign) int16_t state;

//.m
@synthesize state=_state;
-(void) setState:(int16_t)state {
    _state = state;

    NSError* error = nil;
    [[NSManagedObjectContext defaultContext] save:&error];
    if(error != nil){
        NSLog(@"Error in setState, details:%@",[error description]);
    }
}

最后编辑-已解决

分辨率是:除去@synthesise state = _state;-(void) setState:(int16_t)state {}离开@dynamic state 。 然后在evaluateState代替[self setState:pState]; 我用self.state=pState; 而现在各种各样的要求。 现在的问题是,为什么合成的具有财产它没有工作?

Answer 1:

分辨率是:除去@synthesise state = _state;-(void) setState:(int16_t)state {}离开@dynamic状态。 然后在evaluateState代替[self setState:pState]; 我用self.state=pState; 而现在各种各样的要求。



文章来源: Sort/Filter NSFetchRequest how to write sort descriptor taht will use current date?