【发布时间】:2017-12-26 09:29:13
【问题描述】:
我有两个实体 Student 和 Subjects。学生可以有多个科目。我从 Student (NSManagedObject) 获取 NSMutableSet 对象
let studentSubjects = student?.mutableSetValue(forKey: "subjects")
现在我想检查一个科目是否已经属于那个学生。为此,我正在像这样在 NSMutableSet 上应用过滤器
let assignedSubjects = assignedSubjects.filtered(using: NSPredicate(format: "subject_title == %@", "Science"))
现在我正在检查 count 是否 > 0,然后执行一些操作以将主题分配给学生
let subjectEntity = NSEntityDescription.entity(forEntityName: "Subject", in: context)
var subjectObject = NSManagedObject(entity: subjectEntity!, insertInto: context)
if assignedSubjects.count > 0 {
if let filteredItem = assignedSubjects.first as? NSManagedObject {
subjectObject = filteredItem
}
}
if assignedSubjects.count == 0 {
if let subjectsManagedObject = studentSubjects.allObjects as? [NSManagedObject] {
if subjectsManagedObject.count > 0 {
studentSubjects.add(subjectObject)
} else {
student.setValue(NSSet(object:subjectObject), forKey: "subjects")
}
try context.save()
}
} else {
try subjectObject.managedObjectContext?.save()
}
问题是它总是插入新记录而不是保存现有记录。
【问题讨论】:
-
你想删除应用的过滤器,所以你不能删除你使用谓词过滤的行吗?我不明白这一点。
-
无法删除该行,我必须检查记录是否已存在。
-
当我再次尝试获取分配的主题时,我看到过滤器已应用
-
filter(using: predicate)改变集合,但filtered(using: predicate)返回一个全新的集合,其中仅包含与谓词匹配的项目。所以使用let filteredSet = assignedSubjects.filtered(using: predicate),然后测试filteredSet的计数。 -
@pbasdf 你的建议对我有用。现在我正在尝试更新现有的主题记录。如果让filteredItem = filteredItems.first as? NSManagedObject { subjectObject = filteredItem } 这总是在没有关系的表中插入一个新对象
标签: ios core-data swift3 nsmanagedobject nsmutableset