首页 文章

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

提问于
浏览
0

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

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

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

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

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

我使用NSDate属性对tableview行(sortDescriptor)进行排序,并使用“year”属性作为我的节 Headers (sectionNameKeyPath) .

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

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

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

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

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

或者其他一些方式?

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

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 回答

  • 2

    你可以用

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

    这将导致获取请求返回对应于“2014年1月”等对象的不同字典对象 .

    However ,您不能使用获取请求控制器的委托方法(以听取数据更新) .

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

相关问题