【问题标题】:Obtaining values of an attribute through relationships using Core Data - Currently passing NULL使用 Core Data 通过关系获取属性的值 - 当前传递 NULL
【发布时间】:2013-10-13 13:36:44
【问题描述】:

我有一个包含三个实体的核心数据模型:事务、场合、人员,当我当前在事务实体中获取时,我得到“NULL”作为数据库中的值。让我解释。

在我的例子中,事务是与 Person 和 Occasion 有关系的实体。个人实体具有名称属性和与事务实体的关系。交易(个人实体)> whoBy(交易实体)。

还有一个来自categories属性(场合实体)的关系>事件(Transaction Entity)。

我正处于这个应用程序的基本阶段。我有一个表视图控制器,当您按下加号按钮时,系统会在模式视图中要求您添加名称和场合。最终两者都将显示在表格视图中,名称是单元格的主要文本,场合是副标题。

当我将来自用户的插入值直接添加到代表名称属性的 Person 实体时,它可以工作,我在表视图中看到了这一点。场合也是如此(与人分开)。

但是,当我将数据直接添加到事务实体并使用 fetchRequest 来实现时,每次按保存传递值并返回表视图时,都会显示 (NULL)。

我的 AddEntryVC 在保存按钮方法中有这个:

NSManagedObject *newEntry = [NSEntityDescription insertNewObjectForEntityForName:@"Transaction" inManagedObjectContext:context];
[newEntry setValue:self.nameTextField.text forKeyPath:@"whoBy.name"];

在表格视图中,我有:

// 有一个 NSMutableArray 属性叫做 transactions 来保存交易 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Transaction"]; self.transactions = [[managedObjectContext executeFetchRequest:fetchRequest error:nil]mutableCopy];

// 在 cellForRowAtIndexPath 中 NSManagedObject *transaction = [self.transactions objectAtIndex:indexPath.row];

[cell.textLabel setText:[NSString stringWithFormat:@"%@", [transaction valueForKeyPath:@"whoBy.name"]]];

当我运行它时,没有错误/警告,当我添加一个条目时,我看到 (NULL) 作为保存的结果。当我运行相同的代码时,只需将 Transaction 直接修改为 Person,包括 MutableArray,它就可以工作。

所以我快到了.. 但非常感谢任何帮助。我觉得 whoBy.name 的关系不起作用。因为这是一种关系。我无法想象我必须去设置 Person.name 属性;它应该只适用于交易?

我还尝试了获取请求下方的谓词:

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"whoBy.name = %@", self.personTransaction.name];

.. 其中 personTransaction 是一个 @property (nonatomic, strong) Person *personTransaction 属性并且具有相同的结果。

提前致谢

【问题讨论】:

    标签: ios core-data null relationships


    【解决方案1】:

    当您对关系进行操作时,您必须手动创建所有实体,例如你必须更换:

    NSManagedObject *newEntry = [NSEntityDescription insertNewObjectForEntityForName:@"Transaction" inManagedObjectContext:context];
    [newEntry setValue:self.nameTextField.text forKeyPath:@"whoBy.name"];
    

    类似:

    NSManagedObject *transaction = [NSEntityDescription insertNewObjectForEntityForName:@"Transaction" inManagedObjectContext:context];
    NSManagedObject *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
    person.name = self.nameTextField.text;
    transaction.whoBy = person;
    

    顺便说一句,请务必阅读:Core Data Programming Guide - Relationships and Fetched Properties

    【讨论】:

    • 这真是太棒了 Arkadiusz - 这非常有帮助并且完全有效。该链接也确实非常有用。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多