CoreData - 如何在一对多关系中添加多个对象

Posted

技术标签:

【中文标题】CoreData - 如何在一对多关系中添加多个对象【英文标题】:CoreData - how to add multiple objects in a to-many relationship 【发布时间】:2011-12-07 02:34:19 【问题描述】:

好的,所以这个问题有两个问题。

我正在创建一个账单提醒应用程序,并希望使用 CoreData 来存储所有数据(我是新手)。我已经设置了我所有的实体和关系(BillAccount 与 Bills 的一对多关系)。所以一个账户可以有很多账单。

问题 1:有人输入帐户详细信息并设置帐单重复的次数,然后点击保存。如何创建 BillAccount 对象,然后循环并添加刚刚添加的 BillAccount 的所有账单?我可以轻松添加一个账单和账单帐户,但不知道如何将多个账单添加到一个 BillAccount。

问题 2:如何在我已经创建 BillAccount 后向现有的 BillAccount 添加额外的账单...所以第一次编辑账单没有添加?必须首先设置 BillAccount 对象并获取其 uniqueID。我对此有点困惑。

一些基本的代码示例会很棒。感谢您的帮助。

【问题讨论】:

【参考方案1】:

我猜(对不起,如果我错了)你没有为你的核心数据实体生成类。 如果没有 -

    在 Xcode 中深入了解您的模型 在核心数据编辑器中,选择所有实体。 在 Xcode 菜单中转到 Editor --> 创建 managedObject 子类 设置位置并保存。

现在转到您的项目文件系统并找到 BillAccount 实体类。你会在 .h 文件中发现 Xcode 为你生成了“CoreDataGeneratedAccessors”方法:

- (void)addBillsObject:(Bills *)value;
- (void)removeBillsObject:(Bills *)value;
- (void)addBills:(NSSet *)values;
- (void)removeBills:(NSSet *)values;

现在回答你的第一个问题

    获取您希望添加到帐户的所有账单对象 创建一个 NSSet 并将所有账单传递给它

    将集合添加到账单帐户

      NSSet * billsForAccount = [NSSet setWithArray:allTheBills];
      [billAccount addBills:billsForAccount];
    

这就是将许多账单添加到一个帐户。

关于你的第二个问题:

    我发现的通常情况是您向用户展示所有帐户,每个帐户都存储在 tableView 行中(您可以为此使用 NSFetchResultController 但现在无法进入)。 目前您可以在设置accounts tableView时将所有账户存储在一个Array中。 当用户选择一行时,通过从 tableView 中获取 indexPath.row 并从 Array 中获取适当的帐户来存储所选帐户。

    现在使用此对象添加账单,直到用户选择不同的帐户。

    Array *allAccounts = [BillAccount allObjects];//will get all of the accounts
    //in the table view methods - use this array to set the tableView rows
    
      //in the userDidSelectRowForIndexPath use
    BillAccount *selectedAccount = [allAccounts objectAtIndex:indexPath.row];
    
    //now use this for adding the bills. (you might want to pass the selected account to other viewController or any other way appropriate to your App structure.
    //when you want to add new bill use
    [selectedAccount addBillsObject:billObject];
    

【讨论】:

'allTheBills' 是 NSMutableArray 还是实际上是 NSManagedObject 类型的票据?我试图将 allTheBills 设置为可变数组,但在运行 billAccount addBills:billsForAccount] 时出现异常;我已经尝试过 NSMutableArray *allTheBills = [NSMutableArray arrayWithObjects: amount,reminderDate, notes, dueDate, nil]; 是的,您确实需要创建 NSManagedObject 子类并将其作为数组传递。

以上是关于CoreData - 如何在一对多关系中添加多个对象的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 添加对象对多关系

NSPredicate:“添加”一对多关系CoreData中所有实体的属性值

Restkit + Coredata - 仅将唯一对象添加到一对多关系中

核心数据:在一对多关系中匹配多个项目的组合

如何在 Coredata 中的相同实体之间创建多个关系?

16-CoreData之多表关联(存储自定义数据模型)