限制在UITableView行中显示的核心数据实体

时间:2014-04-19 04:13:30

标签: core-data uitableview nspredicate nsfetchedresultscontroller

我想我只是在这里遗漏了一些明显的东西,但这是令人沮丧的事情之一,它以某种方式躲避我。

我有一个名为ProjectEntry的核心数据实体。 ProjectEntry对象以uitableviews显示,使用各种属性,按日期排列(属性包括“dateAsNSDate”[NSDate],“month”[NSString],“year”[NSString],“dayOfWeek”[NSString])。< / p>

我正在使用NSFetchedResultsController来填充表视图。

当我最初创建并保存ProjectEntry对象时,将解析“dateAsNSDate”属性并将其转换为各种NSStrings。一个字符串,也是一个属性,称为“concatMonthAndYear”。它需要“月”和“年”字符串并加入它们。所以我得到了诸如“2014年1月”,“2015年2月”等等。

我使用“concatMonthAndYear”作为我的cell.textLabel.text字符串,以显示在我的tableview单元格中。

我使用NSDate属性对tableview行(sortDescriptor)进行排序,使用“year”属性作为我的section header(sectionNameKeyPath)。

所以现在,我有一个名为“2014”的tableview部分,其中tableview行每个代表一个Core Data对象,在所述部分中命名为“2014年1月”,2014年2月“等等。

我可以点击其中一行,转到另一个tableview,并列出2014年1月创建的所有对象,例如,在第二个tableview上使用NSPredicate。

但是,在我的第一个tableview上,创建的每个Core Data对象都由其自己的tableview行表示。因此,我将获得多行“2014年1月”或“2015年5月”等等。它们是有效的保存对象,我想要它们,但是如果“concatMonthAndYear”已经存在,我想阻止创建新行。如果标题为“2014年1月”的行已存在,我不希望创建新行。我希望存储新的Core Data对象,而不是代表它的新tableviewrow。例如,我只需要一行“2014年1月”,从2014年1月开始列出列出所有实体的表格。

我知道如何使用NSPredicate将所有2014年1月的对象放到第二个表中,但是如何将JUST ONE对象放入第一个表?

NSPredicate不是正确的设备吗?我应该以某种方式阻止在UITableView委托方法中创建新单元格吗?每个tableview行应该是唯一的,而且我是否应该使用NSFetchedResults控制器或tableview委托方法处理它?<​​/ p>

还是其他方式?

有人能指出正确的方向吗?

Table 1 Table 2

已编辑包含代码:

- (void)setupFetchedResultsController
{
    // 1 - Decide which Entity
    NSString *entityName = @"ProjectEntry";
    NSLog(@"Setting up a Fetched Results Controller for the Entity named %@", entityName);

    // 2 - Request Entity
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName];

[request setReturnsDistinctResults:YES];
[request setResultType:NSDictionaryResultType];
[request setPropertiesToFetch:@[@"monthYearTableSecHeader", @"year"]];

    // 3 - Filter it
    //request.predicate = [NSPredicate predicateWithFormat:@" "];

    // 4 - Sort it
    request.sortDescriptors = [NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"year"
                                                                                                 ascending:NO],
                                                         [NSSortDescriptor sortDescriptorWithKey:@"dateAsNSDate"
                                                                                                                                             ascending:YES
                                                                                       selector:@selector(localizedCaseInsensitiveCompare:)], nil];


    //5 - Fetch
    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                        managedObjectContext:self.managedObjectContext
                                                                          sectionNameKeyPath:@"year"
                                                                                   cacheName:nil];

    [self performFetch];

}

1 个答案:

答案 0 :(得分:2)

您可以使用

[fetchRequest setReturnsDistinctResults:YES];
[fetchRequest setResultType:NSDictionaryResultType];
[fetchRequest setPropertiesToFetch:@[@"concatMonthAndYear", @"year"]];

这将导致获取请求返回与&#34; 2014年1月&#34;等对象相对应的不同字典对象。

但是,您无法使用获取请求控制器的委托方法(以听取数据更新)。

如果您需要听取更新,我建议您为数据添加一层间接,其中MonthEntry是表示年度月份的对象,与ProjectEntry有一对多的关系,这是你的正常实体。这样,您可以将获取请求实体设置为MonthEntry