Swift 核心数据联接表多对多关系-对象创建
我想为两个实体创建一个联接表(BadgeProfile):HubProfile和Badge。见下图 第1期:我想知道如何创建“BadgeProfile”对象。此对象应映射到一个“HubProfile”和一个“Badge”对象 第2期:一旦创建了“BadgeProfile”对象,之后“HubProfile”和“Badge”都可以访问该对象。(示例:HubProfile.BadgeProfile)我该怎么做 以下是实体的类别: 轮毂配置文件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
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..我已经发布了一个解决方案--你能看看这是否有意义和正确吗..它对我有用,但我不知道它以后是否会导致任何问题这基本上是我的解决方案,只是针对有序集。