首页 > 解决方案 > 使用 Swift 在 Core Data 中创建多对多关系

问题描述

我正在开发一个闪存卡应用程序,并希望用户能够拥有包含多张卡片的卡片组,并将卡片分配给多个卡片组。例如,有人可能会为“米开朗基罗”、“莱昂纳多·达芬奇”和“伽利略·伽利莱”创建套牌,每个套牌都包含他们许多作品的卡片,但随后他们可能会拥有另一个名为“意大利文艺复兴”的套牌,其中包含所有这些卡片。

如何使用 Swift 建立这种多对多关系。我试图环顾四周,似乎普遍的共识是重新设计结构以仅具有一对多关系,但我不相信我想要实现的目标是可能的。我在想这个错误的方式吗?

任何帮助表示赞赏!谢谢你。

标签: swiftcore-datamany-to-many

解决方案


方法:

在两个关系上创建to many关系

怎么做:

  1. 创建实体Card
  2. 创建实体Deck
  3. 在 EntityCard上,创建一个名为decks. 让目的地成为Deck并使其成为一种to many关系。
  4. 在 EntityDeck上,创建一个名为cards. 设目的地为Card并选择关系为decks

注意:确保正确设置反向关系,这在您使用它们时至关重要,因为您只需执行关系的一侧,核心数据将处理关系的另一侧。

我刚刚粘贴了2个屏幕截图,希望对您有所帮助。

卡关系:

在此处输入图像描述

甲板关系:

在此处输入图像描述

代码:

class LocalDataStorage {

    func test() {

        let context = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)

        let card1 = Card(context: context)
        card1.title = "c1"

        let card2 = Card(context: context)
        card2.title = "c2"

        let deck1 = Deck(context: context)
        deck1.title = "d1"

        let deck2 = Deck(context: context)
        deck1.title = "d2"

        card1.decks = [deck1, deck2]
        card2.decks = [deck1]

        //Notice how the inverse relationships automatically work
        print("deck1.cards = \(String(describing: deck1.cards))") //2 elements
        print("deck2.cards = \(String(describing: deck2.cards))") //1 element
    }
}

推荐阅读