2017-07-20 10 views
0

私は2つのエンティティの学生と科目を持っています。生徒は複数の科目を持つことができます。私は今、私は、被験者がすでにその学生に属しているかどうかを確認したい学生(NSManagedObject)NSMutableSetで適用されたフィルタを削除するには

let studentSubjects = student?.mutableSetValue(forKey: "subjects") 

からNSMutableSetオブジェクトを取得しています。このために私は今、私はカウントが> 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() 
     } 

に対象を割り当てるかチェックしています。この

let assignedSubjects = assignedSubjects.filtered(using: NSPredicate(format: "subject_title == %@", "Science")) 

ようNSMutableSetにフィルタを適用しています既存のレコードを保存するのではなく、常に新しいレコードを挿入します。

+0

適用されたフィルタを削除しますか?述語を使用してフィルタリングする行を削除できませんか?私はその点を得ていない。 – kamil3

+0

私は行を削除することはできません、レコードが既に存在するかどうかを確認する必要があります。 –

+0

割り当てられたサブジェクトを再度フェッチしようとすると、フィルタが適用されていることがわかります –

答えて

0

新しいオブジェクトを挿入する行は、この一つである:かかわらず、現在の生徒が既に関連する主題を有するかどうかの実行さ

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

私は新しい主題を追加したくありません。 Scienceがすでに学生に割り当てられている場合、そのレコードの一部の列を更新したいと考えています。 –

+0

その場合、2番目のif文全体を削除してください( 'if assignedSubjects.count == 0 {...}')。 'subjectObject = filteredItem'の後に属性を更新してください。 – pbasdf

+0

'context.save()'でコンテキストを保存しようとしているときに 'subjectObject = filteredItem'の後に、既存のレコードを更新する代わりに新しいレコードを挿入しています。 –

関連する問題