2015-06-17 31 views
2

我瀏覽的NSArray和發送我所得到的核心數據,例如:斯威夫特CoreData比較字符串與實體

let json2:NSArray = NSJSONSerialization.JSONObjectWithData(data.dataUsingEncoding(NSUTF8StringEncoding)!, options: NSJSONReadingOptions.MutableContainers, error: &error) as! [NSArray] 

     for dict in json2 { 
      var apps = [String]() 

      //Creation du lien vers la base SQLite 
      let entityDescription = NSEntityDescription.entityForName("Task", inManagedObjectContext: self.context!) 
      let nTask = Task(entity: entityDescription!, insertIntoManagedObjectContext: self.context) 


      let request = NSFetchRequest() 
      request.entity = entityDescription 
      var error: NSError? 
      var objects = self.context?.executeFetchRequest(request, error: &error) 


      if let summary = dict["summary"] as? String{ 
       nTask.summary = summary 
      } 


      if let description = dict["description"] as? String{ 
       nTask.detail = description 
      } 


      if let context = dict["context"] as? String{ 
       nTask.context = context 
      } 


      if let due = dict["due"] as? String { 
       nTask.date = due 
      }else{ 
       nTask.date = "No Ending Date" 
      } 

      if let status = dict["status"] as? String{ 
       nTask.status = status 
      } 

      if let responsible = dict["responsible"] as? String{ 
       nTask.responsable = responsible 
      } 

      if let id = dict["id"] as? String{ 
       nTask.id = id 
      } 

      println(nTask) 



      /*let match = objects![0] as! NSManagedObject 
      let result = match.valueForKey("id") as! String 
      println(result) 

      if result != nTask.id{*/ 
       self.context?.save(nil) 
      //} 

的發送效果很好,核心數據填充,一切似乎是確定。

什麼是評論是我正在尋找什麼,目前不起作用。我想檢查一下是否爲nTask.id,它是一個字符串,即「id」鍵的值,與屬性「id」上我的Core Data「Task」上已有的任何id相等。

我正在創建實體描述,請求和請求返回,然後嘗試與nTask.id進行比較,但它總是匹配,我總是訪問我的self.context?.save(nil),我得到了氣球,而我沒有想要它..0。 這就是我想要做的事:

let entityDescription = NSEntityDescription.entityForName("Task", inManagedObjectContext: self.context!) //creation of the Entity Description for my Entity, "Task" 
    let request = NSFetchRequest() 
    request.entity = entityDescription //Creation of the request on the Entity "Task" 
    var error: NSError? 
    var objects = self.context?.executeFetchRequest(request, error: &error) //Results are sent to my variable objects 
let match = objects![0] as! NSManagedObject 
    let result = match.valueForKey("id") as! String 
    println(result) 

    if result != nTask.id{ //try to compare what the request return with the nTask.id 
     self.context?.save(nil) 
    } 

我做得不對還是我失去了一些東西?我只想檢查我的CoreData上是否存在nTask.id,如果它不存在,請將完整的Task發送到我的CoreData。

謝謝你的幫助。

問候。

回答

1

您當前的代碼獲取所有Task對象,但僅比較結果數組中第一個對象的idobjects)。所以在這個數組的其他地方重複將不會被檢測到。

輕微重構您的代碼,首先檢查是否存在Task以及相關的id。使用您擁有但包含謂詞的提取請求,僅提取任何具有相關idTask對象。如果您得到0結果,請創建新的Task。如果你得到1個或多個結果:你需要決定如何處理,但下面的代碼將更新現有對象的屬性值:

for dict in json2 { 
    var apps = [String]() 
    var nTask : Task 

    //Creation du lien vers la base SQLite 
    let entityDescription = NSEntityDescription.entityForName("Task", inManagedObjectContext: self.context!) 

    if let relevantID = dict["id"] as? String { 
     let request = NSFetchRequest() 
     request.entity = entityDescription 
     request.predicate = NSPredicate(format:"id == %@",relevantID) 
     var error: NSError? 
     var objects = self.context?.executeFetchRequest(request, error: &error) 
     if objects!.count == 0 { 
      nTask = Task(entity: entityDescription!, insertIntoManagedObjectContext: self.context) 
     } else { 
      // You need to decide: create a new object and delete the old 
      // update the old object with the new attribute values, or 
      // just ignore the new values 
      // The following will update the existing Task object 
      nTask = objects![0] as! Task 
     } 
    } else { // no `id` to match against, so just create a new Task 
      nTask = Task(entity: entityDescription!, insertIntoManagedObjectContext: self.context) 
    } 
    // Now update the attribute values... 
    if let summary = dict["summary"] as? String{ 
     nTask.summary = summary 
    } 
    if let description = dict["description"] as? String{ 
     nTask.detail = description 
    } 
    if let context = dict["context"] as? String{ 
     nTask.context = context 
    } 
    if let due = dict["due"] as? String { 
     nTask.date = due 
    }else{ 
     nTask.date = "No Ending Date" 
    } 
    if let status = dict["status"] as? String{ 
     nTask.status = status 
    } 
    if let responsible = dict["responsible"] as? String{ 
     nTask.responsable = responsible 
    } 
    if let id = dict["id"] as? String{ 
     nTask.id = id 
    } 
    println(nTask) 

    self.context?.save(nil) 
} 

請注意,這應該工作,但效率不高。您可能想要閱讀Apple核心數據編程指南section on "Efficiently importing data"以獲得更高效的算法。

+0

你好,非常感謝你的回答,我明白你做了什麼來理解一切,它可能需要我一會兒^^ – fselva

+0

你的解決方案就像一個魅力,我編輯了一些我沒有打印的代碼在那裏使其工作,並沒有問題。更新是最好的解決方案。如果id相同但任何改變,像這樣它將被更新而不創建另一個。非常感謝你的幫助! – fselva