2015-07-19 25 views
0

我已經成功編寫了下載解析對象的代碼,獲取我數據庫中的當前對象,然後進行比較。與coredata同步解析數據,我如何確定要刪除哪些對象?

我的算法:

我通過解析對象迭代和運行fetchrequest並比較它們的objectID的。如果我什麼都得不到,我爲我的數據庫創建一個新的對象。否則,我再看看我的數據庫中的modifiedDate和解析和比較的updatedAt,看看是否需要設置新值。這段代碼很好用。

代碼:

query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in 
    if error == nil { 
     if let objects = objects { 
      for object in objects { 
       let object = object as! PFObject 
       let name = object["name"] as! String 
       let email = object["email"] as! String 
       let subjectsTaught = object["subjectsTaught"] as [String: String] 
       let category = object["category"] as! String 
       let uniqueID = object.objectId! 
       let modifiedDate = object.updatedAt! 
       let fetchRequest2 = NSFetchRequest(entityName: "Teacher") 
       fetchRequest2.predicate = NSPredicate(format: "uniqueID == %@", uniqueID) 
       var error2: NSError? 
       if let foundTeachers = self.managedObjectContext.executeFetchRequest(fetchRequest2, error: &error2) as? [Teacher] { 
        if foundTeachers.isEmpty == true { 
         let teacher = NSEntityDescription.insertNewObjectForEntityForName("Teacher", inManagedObjectContext: self.managedObjectContext) as! Teacher 
         teacher.name = name 
         teacher.email = email 
         teacher.subjectsTaught = subjectsTaught 
         teacher.category = category 
         teacher.uniqueID = uniqueID 
         teacher.modifiedDate = modifiedDate 
        } else { 
         if let teacher = foundTeachers.first { 
          let date1 = teacher.modifiedDate 
          let date2 = modifiedDate 
          let compareResult = date1.compare(date2) 
          if compareResult == NSComparisonResult.OrderedAscending { 
           teacher.setValue(name, forKey: "name") 
           teacher.setValue(email, forKey: "email") 
           teacher.setValue(subjectsTaught, forKey: "subjectsTaught") 
           teacher.setValue(category, forKey: "category") 
           teacher.setValue(modifiedDate, forKey: "modifiedDate") 
          } 
         } 
        } 
       } 
       var error: NSError? 
       if !self.managedObjectContext.save(&error) { 
        println("Error \(error)") 
        abort() 
       } 
      } 
     } 

我的問題是如何找出哪些對象,其中不解析?我不想爲我的數據庫中的每個對象查詢解析,因爲我認爲這將是網絡密集型的。

我應該做的所有教師對象fetchrequest在開始的時候,當我通過解析對象迭代,將其刪除,因爲我去?如果我有物品,應該刪除?

回答

0

好的,我想出了該怎麼做。我最終首先爲所有教師運行fetchrequest並將其名稱附加到數組中。在解析迭代過程中,我在刪除了列表中的教師後,最後使用該列表從數據庫中刪除了教師。

 let fetchRequest = NSFetchRequest() 
     fetchRequest.entity = NSEntityDescription.entityForName("Teacher", inManagedObjectContext: self.managedObjectContext) 
     var error: NSError? 
     var foundTeacherNames = [String]() 
     if let foundTeachers = self.managedObjectContext.executeFetchRequest(fetchRequest, error: &error) as? [Teacher] { 
      for teacher in foundTeachers { 
       foundTeacherNames.append(teacher.name) 
      } 
     } 
     //Find teachers in parse database 
     let query = PFQuery(className: "TeacherList") 
     query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in 
      if error == nil { 
       if let objects = objects { 
        for object in objects { 
         let object = object as! PFObject 
         let name = object["name"] as! String 
         let email = object["email"] as! String 
         let subjectsTaught = object["subjectsTaught"] as! [String: String] 
         let category = object["category"] as! String 
         let uniqueID = object.objectId! 
         let modifiedDate = object.updatedAt! 
         let fetchRequest2 = NSFetchRequest(entityName: "Teacher") 
         fetchRequest2.predicate = NSPredicate(format: "uniqueID == %@", uniqueID) 
         var error2: NSError? 
         if let foundTeachers = self.managedObjectContext.executeFetchRequest(fetchRequest2, error: &error2) as? [Teacher] { 
          if foundTeachers.isEmpty == true { 
           let teacher = NSEntityDescription.insertNewObjectForEntityForName("Teacher", inManagedObjectContext: self.managedObjectContext) as! Teacher 
           teacher.name = name 
           teacher.email = email 
           teacher.subjectsTaught = subjectsTaught 
           teacher.category = category 
           teacher.uniqueID = uniqueID 
           teacher.modifiedDate = modifiedDate 
          } else { 
           if let teacher = foundTeachers.first { 
            let date1 = teacher.modifiedDate 
            let date2 = modifiedDate 
            let compareResult = date1.compare(date2) 
            if compareResult == NSComparisonResult.OrderedAscending { 
             teacher.setValue(name, forKey: "name") 
             teacher.setValue(email, forKey: "email") 
             teacher.setValue(subjectsTaught, forKey: "subjectsTaught") 
             teacher.setValue(category, forKey: "category") 
             teacher.setValue(modifiedDate, forKey: "modifiedDate") 
            } 
           } 
          } 
          if contains(foundTeacherNames, name) { 
           let i = find(foundTeacherNames, name)! 
           foundTeacherNames.removeAtIndex(i) 
          } 
         } 
         var error: NSError? 
         if !self.managedObjectContext.save(&error) { 
          println("Error \(error)") 
          abort() 
         } 
         if !foundTeacherNames.isEmpty { 
          for teacher in foundTeacherNames { 
           let request = NSFetchRequest(entityName: "Teacher") 
           request.predicate = NSPredicate(format: "name = %@", teacher) 
           if let fetchResults = self.managedObjectContext.executeFetchRequest(request, error: nil) as? [NSManagedObject] { 
            if fetchResults.count != 0 { 
             self.managedObjectContext.deleteObject(fetchResults[0]) 
            } 
           } 

          } 
         } 
0

是的,最好的方法是獲取所有實體,然後檢查唯一的ID。你可以使用鍵 - 值編碼(或其雨燕等同如map),只是讓你感興趣的IDS。

let existingIDs = entitiesFromParse.map() { $0.uniqueID as? String } 

然後,您可以檢查是否有

let idExists = existingIDs.contains(idToCheck) 

存在的ID這對於昂貴的多個獲取請求是優選的。

+0

只是要小心,你確實檢索你的類的所有對象,即returnedObjects.count <查詢限制 – Tys

+0

可以請你詳細說明,也可以舉個例子,你是如何做這個@Mundi – Tom

+0

@Tom我想解釋是相當完整。你將不得不自己編寫代碼;-)。 – Mundi