我在核心数据中有2个实体,Bill
和Person
。我有两种关系:
Bill
至Person
是一个名为'people'的“To Many”关系Person
到Bill
是'To One' - 称为'bill'。Xcode(以及类)生成的结果是:
Bill
:
extension Bill {
@NSManaged var people: NSSet?
}
Person
:
extension Person {
@NSManaged var bill: Bill?
}
这是我为Person
的{{1}} Bill
添加NSSet
对象而编写的方法:
class Bill : NSManagedObject {
...
func addPersonToBill(contact : CNContact){
let entDesc = NSEntityDescription.entityForName("Person", inManagedObjectContext: managedObjectContext())
// Create Person object with custom initialiser
let person = Person(contact: contact, entity: entDesc!, insertIntoManagedObjectContext: managedObjectContext())
print("Got person")
people = people?.setByAddingObject(person) // CRASHES HERE
}
}
人的自定义初始化程序为:
init(contact : CNContact, entity : NSEntityDescription, insertIntoManagedObjectContext context : NSManagedObjectContext?){
super.init(entity: entity, insertIntoManagedObjectContext: context)
// I set other properties here using info from the CNContact
}
但是,当我添加Person
时,它会在people?.setByAddingObject(person)
崩溃并出现错误:
***由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [_ TtCs21_SwiftDeferredNSArray isEqualToSet:]:无法识别的选择器发送到实例0x7fc7ed875cb0'
当我删除从bill
到Person
的{{1}}关系时,它运行正常并且Bill
已添加到Person
的'人'中Bill
。我可以这样离开,因为我不一定需要这种反向关系,但我已经读过,除非我有充分的理由不这样做,否则最好有反向关系。我也在我的应用程序中遇到了这个问题与其他关系,所以我会有很多关系而没有反向。
任何想法有什么不对?我的关系不正确吗?一个NSSet
可以包含多个Bill
个,但一个Person
只能有一个Person
。
我尝试的解决方案是:
从this answer添加此访问者:
Bill
但我收到错误:
由于未捕获的异常而终止应用 'NSInvalidArgumentException',原因:'*** - [NSSet intersectsSet:]: set参数不是NSSet'
@NSManaged func addPeopleObject(value:Person)
: NSMutableOrderedSet
...但是我得到了相同的原始崩溃消息。
非常感谢任何帮助,谢谢。
答案 0 :(得分:2)
啊,我和[这个问题]有类似的问题。1我在Bill
上有一个名为getOwers
的方法,它有一个数组的返回类型,这似乎是覆盖CoreData创建的访问器。我将方法更改为getOwersArr
,现在一切都很好。感谢@ Paulw11指出我正确的方向!
答案 1 :(得分:0)
我还有许多关系实现为NSSet
。我使用以下代码添加/删除对象(没有任何问题):
let mutableSet = bill.mutableSetValueForKey("people")
mutableSet.addObject(newPerson)
// (next, save managed object context)
答案 2 :(得分:0)
我在iOS 9.3中遇到了与一对多关系类似的问题。
我通过替换:
来修复它 group.addToTeams(team) // Crashes on iOS 9.3
使用:
team.group = group // This will correctly add team to the set without crashing
基本上不是向集合添加对象而是使用反向关系。