【问题标题】:How to remove applied filter on a NSMutableSet如何删除 NSMutableSet 上应用的过滤器
【发布时间】: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


【解决方案1】:

插入新对象的行是这一行:

    var subjectObject = NSManagedObject(entity: subjectEntity!, insertInto: context)

无论当前学生是否已经有相关科目,都会执行。修改你的代码如下:

 var subjectObject : NSManagedObject
 if assignedSubjects.count > 0 {
      if let filteredItem = assignedSubjects.first as? NSManagedObject {
           subjectObject = filteredItem

      }
 }
if assignedSubjects.count == 0 {
    let subjectEntity = NSEntityDescription.entity(forEntityName: "Subject", in: context)
    subjectObject = NSManagedObject(entity: subjectEntity!, insertInto: context)
    // I assume, following your example, you want to add a new subject with title "Science"....
    subjectObject.setValue("Science", forKey: "subject_title")

     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()
      }

【讨论】:

  • 我不想添加新主题。如果科学已经分配给学生,那么我想更新该记录的某些列。
  • 在这种情况下,只需删除整个第二个 if 语句 (if assignedSubjects.count == 0 { ... })。更新subjectObject = filteredItem之后的属性。
  • 在subjectObject = filteredItem 之后,当我尝试使用try context.save() 保存上下文时,它会插入新记录而不是更新现有记录。
猜你喜欢
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 2014-03-22
  • 1970-01-01
  • 2021-06-16
相关资源
最近更新 更多