Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 核心数据联接表多对多关系-对象创建_Swift_Join_Core Data_Many To Many - Fatal编程技术网

Swift 核心数据联接表多对多关系-对象创建

Swift 核心数据联接表多对多关系-对象创建,swift,join,core-data,many-to-many,Swift,Join,Core Data,Many To Many,我想为两个实体创建一个联接表(BadgeProfile):HubProfile和Badge。见下图 第1期:我想知道如何创建“BadgeProfile”对象。此对象应映射到一个“HubProfile”和一个“Badge”对象 第2期:一旦创建了“BadgeProfile”对象,之后“HubProfile”和“Badge”都可以访问该对象。(示例:HubProfile.BadgeProfile)我该怎么做 以下是实体的类别: 轮毂配置文件 class HubProfile: NSManagedO

我想为两个实体创建一个联接表(BadgeProfile):HubProfile和Badge。见下图

第1期:我想知道如何创建“BadgeProfile”对象。此对象应映射到一个“HubProfile”和一个“Badge”对象

第2期:一旦创建了“BadgeProfile”对象,之后“HubProfile”和“Badge”都可以访问该对象。(示例:HubProfile.BadgeProfile)我该怎么做

以下是实体的类别:

轮毂配置文件

class HubProfile: NSManagedObject {
  @NSManaged var id: NSNumber?
  @NSManaged var name: String?
  @NSManaged var hubBadgeProfiles: NSOrderedSet?
}
class Badge: NSManagedObject {
  @NSManaged var id: NSNumber?
  @NSManaged var name: String?
  @NSManaged var score: NSNumber?
  @NSManaged var badgeProfiles: NSOrderedSet?
}
class BadgeProfile: NSManagedObject {
  @NSManaged var id: NSNumber?
  @NSManaged var badge: Badge?
  @NSManaged var hubProfile: HubProfile?
}
徽章

class HubProfile: NSManagedObject {
  @NSManaged var id: NSNumber?
  @NSManaged var name: String?
  @NSManaged var hubBadgeProfiles: NSOrderedSet?
}
class Badge: NSManagedObject {
  @NSManaged var id: NSNumber?
  @NSManaged var name: String?
  @NSManaged var score: NSNumber?
  @NSManaged var badgeProfiles: NSOrderedSet?
}
class BadgeProfile: NSManagedObject {
  @NSManaged var id: NSNumber?
  @NSManaged var badge: Badge?
  @NSManaged var hubProfile: HubProfile?
}
BadgeProfile

class HubProfile: NSManagedObject {
  @NSManaged var id: NSNumber?
  @NSManaged var name: String?
  @NSManaged var hubBadgeProfiles: NSOrderedSet?
}
class Badge: NSManagedObject {
  @NSManaged var id: NSNumber?
  @NSManaged var name: String?
  @NSManaged var score: NSNumber?
  @NSManaged var badgeProfiles: NSOrderedSet?
}
class BadgeProfile: NSManagedObject {
  @NSManaged var id: NSNumber?
  @NSManaged var badge: Badge?
  @NSManaged var hubProfile: HubProfile?
}
p.S:我知道我不需要创建联接表,可以使用HubProfile之间的多对多关系。但是我想创建联接表,因为这样可以很容易地与后端数据库交互。

要创建联接表对象: 以与创建任何其他实体相同的方式创建它,例如,通过

NSEntityDescription.insertNewObjectForEntityForName(...)
然后只需添加要链接的对象

badgeProfile.hubProfile = hubProfile
badgeProfile.badge = badge
我建议不要使用有序集。它们很复杂,而且容易出错。例如,上述情况就成了真正令人头痛的问题。相反,在
BadgeProfile
实体中使用数字属性来跟踪订单

访问连接的对象的步骤 这里没什么特别的。获取个人资料的所有徽章:

profile.hubBadgeProfiles.map { $0.badge! }
(我认为您的属性名称选择得不好。我建议
徽章
,另一方面,为
徽章
实体选择相应的
配置文件
。)

获得特定的徽章:

profile.badges.filter { $0.badge!.name == "Gold" }.first as? Badge

使用模拟模式转到另一个方向。

我想我已经找到了解决方案:

创建示例对象:

func loadBadgeProfilesPart2() //Second Way to Create BadgeProfile
{

    let hubProfileEntity = NSEntityDescription.entityForName("HubProfile", inManagedObjectContext: managedContext)
    let hubProfile1 = HubProfile(entity: hubProfileEntity!, insertIntoManagedObjectContext: managedContext)
    hubProfile1.id = 5
    hubProfile1.name = "EFG"

    let badgeEntity = NSEntityDescription.entityForName("Badge", inManagedObjectContext: managedContext)
    let badge1 = Badge(entity: badgeEntity!, insertIntoManagedObjectContext: managedContext)
    badge1.id = 5
    badge1.name = "Polite"

    let badgeProfileEntity = NSEntityDescription.entityForName("BadgeProfile", inManagedObjectContext: managedContext)
    let badgeProfile1 = BadgeProfile(entity: badgeProfileEntity!, insertIntoManagedObjectContext: managedContext)
    badgeProfile1.id = 3

    let badgeProfile2 = BadgeProfile(entity: badgeProfileEntity!, insertIntoManagedObjectContext: managedContext)
    badgeProfile2.id = 4

    let badgeProfileSet: NSMutableOrderedSet = []  //Add to an NSOrderedSet
    badgeProfileSet.addObject(badgeProfile1)
    badgeProfileSet.addObject(badgeProfile2)

    hubProfile1.hubBadgeProfiles = badgeProfileSet //Assign BadgeProfile to HubProfile
    badge1.badgeProfiles = badgeProfileSet //Assign BadgeProfile to Badge

    do
    {
        try! self.managedContext.save()
    }

}
获取TableView中的对象

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("cell") as! BadgeProfileViewCell!
    configureCell(cell, indexPath: indexPath)
    return cell
}

func configureCell(cell: BadgeProfileViewCell, indexPath: NSIndexPath) //Showing in TableView
{
    let badgeProfile = fetchedResultsController.objectAtIndexPath(indexPath) as! BadgeProfile
    cell.nameLabel?.text = badgeProfile.hubProfile?.name
    cell.badgeLabel?.text = badgeProfile.badge?.name
}

这似乎起作用了。

谢谢。我有3个问题:1)当我创建一对多关系时,我是否应该不勾选orderedSet列2)我不太明白BadgeProfile中的number属性将做什么3)what does“.map{$0.badge!}”doOK,如果您喜欢有序集,可以继续使用它们。我可以研究如何建立这种关系
map
闭包将集合中的元素(连接实体)替换为相应的徽章。
意味着我们确信这种关系永远不会是
nil
。嗨,Mundi..我已经发布了一个解决方案--你能看看这是否有意义和正确吗..它对我有用,但我不知道它以后是否会导致任何问题这基本上是我的解决方案,只是针对有序集。