如何在 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 中获取核心数据中的多对多关系?的主要内容,如果未能解决你的问题,请参考以下文章