核心数据关系问题

时间:2014-03-02 23:42:32

标签: ios core-data

我有一个简单的应用,包含三种观看次数HomeViewControllerAddViewControllerAddCategoryViewController

我的数据模型有两个实体,关系如下:

enter image description here

我的目标是能够在WMDGActivity的tableview中显示HomeViewController个对象,这些对象分组在WMDGCategory个对象定义的部分下。

通过WMDGCategory中的文字字段添加新的AddCategoryViewController个对象,并通过WMDGActivity中的文字字段添加新的AddViewController个对象。

我的问题是应用程序在取消或保存任何一个辅助视图时崩溃。错误代码总是:

reason: '[<WMDGActivity 0x8a54830> valueForUndefinedKey:]: the entity WMDGActivity is not key value coding-compliant for the key "WMDGCategory".'

每次滚动包含WMDGCategory对象名称的选择器轮时,我也会看到这一点:

data: {
    activities = "<relationship fault: 0x8db1600 'activities'>";
    name = Pastimes;

事实上,另一个谜团是该应用程序显然在崩溃前保存了这些对象。我已经尝试逐步完成代码,但尚未提出解决方案。我怀疑我的实体设置方式有问题,或者我的代码与它们交互时存在问题。

以下是我认为的相关代码:

来自HomeViewController(AddViewControllerAddCategoryViewController的委托:

#pragma mark AddViewControllerDelegate stuff

-(void) addViewControllerDidSave
{
    NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];
    [localContext MR_saveToPersistentStoreAndWait];
    [self.navigationController dismissViewControllerAnimated:YES completion:nil];
    [self refreshData];

}

-(void) addViewControllerDidCancel:(WMDGActivity *) activityToDelete
{
    [activityToDelete MR_deleteEntity];
    [self.navigationController dismissViewControllerAnimated:YES completion:nil];
    [self refreshData];

}

#pragma mark AddCatControllerDelegate stuff

-(void) addCatControllerDidSave
{
    NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];
    [localContext MR_saveToPersistentStoreAndWait];
    [self.navigationController dismissViewControllerAnimated:YES completion:nil];
    [self refreshData];

}

-(void) addCatControllerDidCancel:(WMDGCategory *) categoryToDelete
{
    [categoryToDelete MR_deleteEntity];
    [self.navigationController dismissViewControllerAnimated:YES completion:nil];
    [self refreshData];

}

来自AddCategoryViewController:

- (IBAction)saveButton:(UIBarButtonItem *)sender
{
    if (self.catTextField.text.length > 0)
    {
        self.thisCategory.name = self.catTextField.text;
    }
    [self.delegate addCatControllerDidSave];
}

- (IBAction)cancelButton:(UIBarButtonItem *)sender
{
    [self.delegate addCatControllerDidCancel:self.thisCategory];
}

来自AddViewController:

- (IBAction)saveButton:(UIBarButtonItem *)sender
{
    if (self.activityField.text.length > 0)
    {

        if (self.categoryLabel.text.length < 1)
        {
            self.thisCategory.name = @"Uncategorized";
            //            self.thisActivity.activityName = self.activityField.text;
            //            [self.delegate addActivityViewControllerDidSave];
        }

        else
        {
        self.thisCategory.name = self.categoryLabel.text;
        self.thisActivity.name = self.activityField.text;
        NSLog(@"Category name is %@", self.thisCategory.name);
        NSLog(@"Activity name is %@", self.thisActivity.name);
        }


        [self.delegate addViewControllerDidSave];

    }

    else
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"No activity entered"
                                                        message:@"Please enter a new activity or Cancel"
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
    }



}

- (IBAction)cancelButton:(UIBarButtonItem *)sender
{
    [self.delegate addViewControllerDidCancel:self.thisActivity];
}

任何人都可以告诉我我做错了吗?

1 个答案:

答案 0 :(得分:1)

  

我的问题是应用程序在取消或保存任何一个辅助视图时崩溃。错误代码总是:

查看错误调用堆栈和发生错误的代码会有所帮助。但我会继续猜测,即您正在配置NSFetchedResultsController并将WMDGCategory指定为sectionNameKeyPath。这有两个问题。首先,关键路径是toCategoryWMDGCategory是数据类型。其次,要按类别名称组织表格视图,您需要使用密钥路径toCategory.name。此外,您还需要按toCategory.nameNSFetchedResultsController的要求)对活动进行预先排序。

  

每次滚动包含WMDGCategory对象名称的选择器轮时,我也会看到这一点:

您所看到的是WMDCategory对象的描述。你需要的是name属性的值。您需要使用[category valueForKey:@"name"],或者如果您使用便利类category.name