如何在 IOS Swift 中获取核心数据中的多对多关系?

Posted

技术标签:

【中文标题】如何在 IOS Swift 中获取核心数据中的多对多关系?【英文标题】:How to fetch to-many relationships in Core data in IOS Swift? 【发布时间】:2016-05-13 07:23:10 【问题描述】:

我一直在尝试获取核心数据中一对多关系的关系值。 我有两个实体人员和地址。人可以有多个地址,它有两个属性名称和年龄。而地址只有一个属性城市。

这是我尝试设置值的方式

let managedContext = (UIApplication.sharedApplication().delegate as? AppDelegate)!.managedObjectContext

let entity = NSEntityDescription.entityForName("Person", inManagedObjectContext: managedContext)
let addEntity = NSEntityDescription.entityForName("Address", inManagedObjectContext: managedContext)

let person = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: managedContext)

let address = NSManagedObject(entity: addEntity!, insertIntoManagedObjectContext: managedContext)

person.setValue(name, forKey: "name")
person.setValue(age, forKey: "age")
address.setValue(city, forKey: "city")

person.setValue(NSSet(object: address), forKey: "addresses")

do 
    try person.managedObjectContext?.save()
    people.append(person)
 catch let error as NSError 
    print("Could not save \(error)")

这就是我的核心数据属性的设置方式

extension Person 

   @NSManaged var age: NSNumber?
   @NSManaged var name: String?
   @NSManaged var addresses: Address?



extension Address 

   @NSManaged var city: String?
   @NSManaged var persons: Person?


然后为了获取表格视图中的数据,我正在尝试做这样的事情

let person = people[indexPath.row]
let address = person.mutableSetValueForKey("addresses")
print(address.allObjects.first as! Address)

打印的价值是这样的

<Address: 0x7f9481f1e290> (entity: Address; id: 0xd000000000040002 <x-coredata://7A4230B9-0EF0-44D5-BBDD-D8E9A3E38F59/Address/p1> ; data: <fault>)

任何帮助将不胜感激。提前致谢。

【问题讨论】:

在模型中创建反向关系也简单得多,因此从地址到人的反向关系。然后只需设置address.person=person,Core Data 就会为您处理前向关系 @Paulw11 我已经在数据模型中设置了反向关系。我的问题是如何从 NSSet 中检索字符串? let someAddress = address.allObjects.first - 你已经有了这个代码。然后就像print(someAddress.city) 感谢@Paulw11 它的作品我想我们需要做这样的事情: let addressRln = person.valueForKey("addresses") let address = addressRln?.allObjects.first as!地址打印(address.city) 【参考方案1】:

检查它是关系(不是属性)。并且是对多的。像这样: 之后,它会是这样的:

extension Album 

    @NSManaged var createDate: NSDate?
    @NSManaged var isDefault: NSNumber?
    @NSManaged var name: String?
    @NSManaged var order: NSNumber?
    @NSManaged var picture: NSData?
    @NSManaged var notes: NSOrderedSet? // Attention: NSOrderedSet


【讨论】:

我已经重新生成了核心数据模型,这就是现在设置的 @NSManaged var 地址:NSSet? @AshutoshJha 然后设置地址保存,就像普通属性一样。 @AshutoshJha 保存地址后,通过person.addresses访问它们【参考方案2】:

您展示的模型并非您所说的那样。您的模型显示了错误命名的 1:1 关系。根据您的代码,您应该打赌会崩溃。

@NSManaged var addresses: Address?  // is not a 1:N

我建议您检查您的数据模型并重新生成您的代码。

【讨论】:

以上是关于如何在 IOS Swift 中获取核心数据中的多对多关系?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:获取特定对象的多对多关系中的所有实体?

NSPredicate 在核心数据中的多对多关系

核心数据 - 在对象中的多对关系更改属性后更新 UI

如何从雄辩关系中的第三个表中获取数据雄辩的多对多关系

NSFetchedResultsController:如何从实体的多对多关系中获取sectionName

核心数据:与状态的多对多关系