ios - 核心数据关系问题

标签 ios core-data

我有一个具有三个 View 的简单应用 HomeViewController , AddViewController , 和 AddCategoryViewController .

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

enter image description here

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

WMDGCategory对象通过 AddCategoryViewController 中的文本字段添加和新WMDGActivity对象通过 AddViewController 中的文本字段添加.

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

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];
}

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

最佳答案

My problem is that the app crashes upon canceling or saving in either of the auxiliary views. The error code is invariably:

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

I also see this every time I roll the picker wheel containing the names of WMDGCategory objects:

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

关于ios - 核心数据关系问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22135267/

相关文章:

ios - FScalendar View 中的自定义?

ios - TableView AccessoryType Checkmark 洗牌

ios - 具有许多粒子的逐帧动画?

ios - swift 2 : Save coredata with one-to-many conditions

objective-c - 跨模型获取的属性

ios - 添加之前检查值是否在 sqlite 数据库中

ios - UIPickerView NSInvalidArgumentException',原因: '-[__NSCFString superview]: unrecognized selector sent to instance

ios - 数组扩展以按值删除对象

ios - 所需类型 NSNumber 给定类型 __NSCFString 错误

ios - 由于核心数据 Segue 传输导致应用程序崩溃