【问题标题】:Add ability to set nil for a relationship core-data添加为关系核心数据设置 nil 的功能
【发布时间】:2011-09-08 17:43:29
【问题描述】:

我有两个具有多对一关系的实体。例如Employee <<---> Shop。当我创建一个新员工时,我可以为它选择一个商店。我获取所有可用的商店,然后从表格视图中选择一个。
现在,我想在这个表中添加一个新行,以便能够将 nil 设置为关系,例如通过添加一个名为 "None" 的行,当它被选中时,关系将为 employee.shop = nil;
是否可以?我不知道如何配置表格视图来完成这项工作...
但是,这是用于获取商店的代码:

-(NSArray *)projectsList
{
    if (!projectsList) {
        NSFetchRequest *request = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Project" inManagedObjectContext:taskObject.managedObjectContext];
        [request setEntity:entity];

        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];
        NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
        [request setSortDescriptors:sortDescriptors];

        NSError *error = nil;
        NSArray *projects = [taskObject.managedObjectContext executeFetchRequest:request error:&error];
        if (!projects) {
            NSLog(@"Risultati della richiesta nulli!");
            abort();
        }

        projectsList = [projects mutableCopy];
    }

    return projectsList;
}

还有一些tableView方法:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [[self projectsList] count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    Project *project = (Project *)[[self projectsList] objectAtIndex:indexPath.row];
    cell.textLabel.text = project.title;

    if (project == taskObject.project) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }
    else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    cell.accessoryType = UITableViewCellAccessoryCheckmark;

    Project *project = (Project *)[projectsList objectAtIndex:indexPath.row];
    taskObject.project = project;

    NSError *error = nil;
    if (![taskObject.managedObjectContext save:&error]) {
        NSLog(@"Errore nel salvare il progetto per il task! %@, %@", error, [error userInfo]);
        abort();
    }
    else {
        [self.navigationController popViewControllerAnimated:YES];
    }
}

非常感谢!

【问题讨论】:

    标签: iphone core-data relationship fetch null


    【解决方案1】:

    应该这样做。

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return [[self projectsList] count] + 1;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"Cell";
    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }
    
        if ( indexPath.row == [projectsList count] )
        {
            cell.textLabel.text = @"None";
            cell.accessoryType = ( taskObject.project ) ? UITableViewCellAccessoryNone : UITableViewCellAccessoryCheckmark;
        }
        else
        {
            Project *project = (Project *)[[self projectsList] objectAtIndex:indexPath.row];
            cell.textLabel.text = project.title;
    
            if (project == taskObject.project) {
                cell.accessoryType = UITableViewCellAccessoryCheckmark;
            }
            else {
                cell.accessoryType = UITableViewCellAccessoryNone;
            }
        }
    
        return cell;
    }
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    
        if ( indexPath.row == [projectsList count] )
        {
            taskObject.project = nil;
        }
        else
        {
            Project *project = (Project *)[projectsList objectAtIndex:indexPath.row];
            taskObject.project = project;
        }
    
        NSError *error = nil;
        if (![taskObject.managedObjectContext save:&error]) {
            NSLog(@"Errore nel salvare il progetto per il task! %@, %@", error, [error userInfo]);
            abort();
        }
        else {
            [self.navigationController popViewControllerAnimated:YES];
        }
    }
    

    【讨论】:

    • 请记住,设置 taskObject.project = nil 不会删除 Project 对象。如果您没有在其他任何地方使用它,您可能需要删除它。
    • 是的,我知道,但我只想删除它对这个任务的引用......它应该可用于其他任务:) 对吗?如果我错了,请纠正我,因为我最近开始使用关系 :) 谢谢!
    • 非常感谢!这段代码效果很好......只有一件事:如果不太难做,是否可以将 None 单元格设置为表格中的第一个?
    • 可以,indexPath.row == 0时设置taskObject.project = nil,其他单元格的索引偏移1。
    • Project *project = [projectsList objectAtIndex:indexPath.row - 1];
    猜你喜欢
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 2016-12-01
    • 1970-01-01
    相关资源
    最近更新 更多