NSFetchedResultsController用于从coredata中获取日期,并在UITableview

时间:2016-11-03 05:32:38

标签: ios objective-c iphone uitableview core-data

我正在存储来自textfield的字符串输入及其创建的dateandtime。我将日期值存储在coredata中,其中键messageDate是一个字符串数据类型。我将我的日期值转换为字符串并将其存储在coredata中。我能够看到存储日期和文本值的数组,如下所示

timeAndDateMsgArr (
    "2016-11-02 17:59 PM",
    "2016-11-02 18:08 PM",
    "2016-11-02 18:08 PM"
)

textArr (
        "Hai",
        "The",
        "I'm"
    )

我可以通过在CustomCell中添加两个标签,在UITableView中查看存储的文本及其创建日期。但我需要按日期对文本进行分组。我已经尝试了很多解决方案,下面是其中之一

- (NSFetchedResultsController *)fetchedResultsController {

    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

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

    NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                              initWithKey:@"messageDate" ascending:NO];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

    [fetchRequest setFetchBatchSize:20];

    NSFetchedResultsController *theFetchedResultsController =
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                        managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil
                                                   cacheName:@"Root"];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;

     NSLog(@"fetchcontroller %@",_fetchedResultsController);

    return _fetchedResultsController;

}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    NSString *rawDateStr = [[[self.fetchedResultsController sections] objectAtIndex:section] name];
    NSLog(@"raw %@",rawDateStr); //****** i am getting null value here************//
    // Convert rawDateStr string to NSDate...
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss ZZ"];
    NSDate *date = [formatter dateFromString:rawDateStr];

    // Convert NSDate to format we want...
    [formatter setDateFormat:@"d MMMM yyyy"];
    NSString *formattedDateStr = [formatter stringFromDate:date];
    return formattedDateStr;
}

发布图片以获得一些想法,当前输出就像 enter image description here

我的预期输出将如下所示,我将在月份上显示日期 enter image description here

但我需要按日期分组显示消息。我已经尝试了适合我的要求的苹果示例代码,其中日期键存储在日期数据类型中,但在我的情况下,我将日期存储在字符串数据类型中。在我的情况下,我无法更改数据类型,因为它会影响代码。是他们的替代解决方案还是我需要更改数据类型?任何帮助将非常感激。

Apple示例代码参考链接 REF LINK

1 个答案:

答案 0 :(得分:0)

您可以通过向Core Data实体添加非可选的非瞬态String -messageDateSectionId属性来彻底解决此问题。

将此-sectionId属性派生自main -messageDate属性;无论何时设置-messageDate,还要将-messageDateSectionId设置为自定义格式。

因此,您将保存此衍生的-sectionId属性以及您的主要属性。

接下来,在创建-fetchController时,将-sectionNameKeyPath设置为-sectionId属性。 2013年1月1日至31日的所有内容都具有相同的-sectionId,因此将在表格中组合在一起。

对于-titleForHeaderInSection,您只需返回-fetchController.sections [SECTION_NUMBER] .name值即可显示您的-sectionId字符串。