仅从NSFetchRequest返回最新的NSManagedObjects

时间:2014-07-18 14:24:04

标签: ios core-data nsfetchedresultscontroller nsfetchrequest

我使用的是NSFetchedResultsController,需要根据最新的日期和名称返回不同的对象。每个日期都存储为NSDate。

示例:

Object1 名称:Object1 日期:01/01/2001

Object2的 名称:对象 日期:01/02/2001

Object3 名称:OtherObject 日期:2001年1月10日

Object4 名称:OtherObject 日期:02/01/2001

预期结果(找到重复项时仅返回最新日期对象):

名:对象 日期:01/02/2001

名:OtherObject 日期:02/01/2001

//下面会返回正确排序的所有内容,尽管我只需要根据日期进行最新的匹配。

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
                               entityForName:@"Object" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

// Create the sort descriptors array.
NSSortDescriptor *name = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSSortDescriptor *date = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];

NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:name, date, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

修改 截至目前,我正在将所有对象提取到一个数组中,对于array1中的每个对象,我循环并将其与array2中具有相同名称的最新匹配对象相加/比较,并从array2中删除最旧的日期条目然后我就是在array2中留下了唯一的最新日期。我希望用一个fetchrequest /子查询来做一个不那么繁琐的方法。

2 个答案:

答案 0 :(得分:0)

核心数据不会自动跟踪广告订单。当您获取取回的对象时,其实体将以任何随机顺序。

我对此的直接想法是,您需要另一个属性来跟踪插入时间并按此属性重新排序/排序。

因此,您的属性需要是一个带秒的日期时间。你会这样称呼:

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

并将其存储在属性中。获取对象时,请按此属性的键进行排序。

答案 1 :(得分:0)

试试这个......

  1. 创建属性name的NSSet以返回唯一的数据集。
  2. 获取每个属性date的最新属性name
  3. 例如:

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Object"
                                              inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];
    
    NSArray *objects = [self.managedObjectContext executeFetchRequest:fetchRequest];
    
    NSMutableArray *arrayObjectNames = [[NSMutableArray alloc] init];
    for (Object *object in objects) {
        [arrayObjectNames addObject:object.name];
    }
    NSSet *setObjectNames = [NSSet setWithArray:arrayObjectNames];
    
    NSString *key = @"name";
    NSMutableDictionary *dictNamesDates = [NSMutableDictionary dictionary];     
    for (NSString *objectName in setObjectNames) {
        NSFetchRequest *fetchName = [[NSFetchRequest alloc] initWithEntityName:@"Object"]; 
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", key, objectName];
        [fetchName setPredicate:predicate];
        NSSortDescriptor *sortDate = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];
        [fetchName setSortDescriptors:@[sortDate]];
        Object *targetObject = [[self.managedObjectContext executeFetchRequest:fetchName] lastObject];
        if (targetObject) [dictNamesDates setObject:targetObject.date forKey:objectName];
        //OR as an alternative but achieving the same outcome...
        if (targetObject) [dictNamesDates setValue:targetObject.date forKey:targetObject.name];
    }
    

    这应该创建一个NSMutableDictionary,其中包含每个属性name作为键,相应的最新属性date作为值。

    这有帮助吗?