【问题标题】:CoreData Many-To-Many relationship with attributes. Insert, Delete, RequestCoreData 与属性的多对多关系。插入、删除、请求
【发布时间】:2026-01-13 15:50:01
【问题描述】:

我对 CoreData 有以下问题,我找不到任何处理它的教程。问题是我在两个实体之间存在多对多关系:Station 和 Program。一个给定的电台可以分配许多节目,一个给定的节目可以分配给许多电台。在中间,时间与关系相关联。因此,元组站节目具有关联的属性时间。环顾四周,我发现最好的解决方案是创建一个中间实体,我称之为 TimeStationProgram:

站 > TimeStationProgram 节目

我可以正常创建 Station 和 Program 的实例。但是,我不知道如何创建新实体 TimeStationProgram 的特定实例。我也不知道如何删除或恢复特定数据。谢谢!

也欢迎使用 Objective-C 编写代码。

【问题讨论】:

    标签: core-data swift


    【解决方案1】:

    我已经稍微修改了您的 ERD,在 Station 和 Program 之间添加了额外的关系(假设您想要执行以下操作:给定一个电台,向我展示所有程序,反之亦然)。此外,我将电台/节目和 TimeStationProgram 之间的关系更改为一对一,因为您在单个电台和单个节目之间只会有 1 次关系(即,您不会有多次该节目将可以在同一个站点上使用)

    现在,上面提到的每个项目都是一个“对象”。因此,当您开始创建对象并将它们关联在一起时,您需要考虑它们。

    // Create the instances
    
    // create a Station
     Station *dbEntityStation = [NSEntityDescription
                                      insertNewObjectForEntityForName:@"Station"
                                      inManagedObjectContext:[self.managedObjectContext]];
    
    // create a Program
     Program *dbEntityProgram = [NSEntityDescription
                                      insertNewObjectForEntityForName:@"Program"
                                      inManagedObjectContext:[self.managedObjectContext]];
    
    // create a TimeStationProgram
     TimeStationProgram *dbEntityTSP = [NSEntityDescription
                                      insertNewObjectForEntityForName:@"TimeStationProgram"
                                      inManagedObjectContext:[self.managedObjectContext]];
    
    // Handle the relationships
    
    // Map Station to TimeStationProgram
    dbEntityStation = dbEntityTSP;
    
    // Map Program to TimeStationProgram
    dbEntityProgram = dbEntityTSP; // note same TSP instance for both Station & Program
    
    // Map Station to Program
    [dbEntityStation addProgramsObject:dbEntityProgram]
    // if you wanted to add multiple Program(s) to a Station you would need to load them into a set then add as follows
    // NSMutableSet *programs = [NSMutableSet new];
    // <load up the set with Program(s)
    // [dbEntityStation addPrograms:programs];
    

    关键点是您需要创建提到的 3 个对象中的每一个。您需要确定应该关联哪些对象,然后您需要收集这些对象并通过它们的关系将它们相互映射。我上面使用的示例很简单,我希望您的程序会更复杂。尤其是处理获取现有程序并将它们与站点相关联的部分。

    注意:这不是代码完整的,但它应该绘制图片。

    【讨论】:

    • 非常感谢!最好将 Station/Program 和 TimeStationProgram 之间的关系更改为 1 对 1。我将尝试从这个 ERD 继续编码。谢谢!!!
    • 我肯定需要一个to-many关系:Station > TimeStationProgram Program 在这种情况下,我仍然不知道如何在对象的情况下插入数据TimeStationProgram 实体。谢谢
    • 好的。查看实体的头文件,尤其是 TimeStationProgram。您应该会在文件底部看到一些定义的辅助方法(请参阅上面的我的 cmets)。这些用于将单个对象或一组对象添加到关系中。请参阅上面的解决方案并应用我所说的关于程序的内容。如果您使用 to-many,唯一真正改变的是您正在处理“集合”。
    • 例如// 将 TimeStationProgram 映射到 Station,如下所示:[dbEntityTimeStationProgram addSationsObject:dbEntityStation]