2015-10-31 57 views
0

我試圖保存對象,以核心數據是從parse牽強,但我想只有那些不包含名稱,即已經在數據庫中的核心數據:保存對象與NSPredicate

func fetchFromParse() { 

    let entity = NSEntityDescription.entityForName("Medicine", inManagedObjectContext: context) 
    let query = PFQuery(className: "Medicine") 
    query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in 
     if error == nil { 
      for object in objects! { 
       let medicine = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: self.context) 

       if let name = object["medicineName"] as? String, 
        amount = object["amountQuantity"] as? String { 

         let predicate = NSPredicate(format: "name != %@", name) 
         self.fetchRequest.predicate = predicate 

         do{ 
          let fetchedEntities = try self.context.executeFetchRequest(self.fetchRequest) as! [Medicine] 
          //save to Core Data 


          medicine.setValue(name, forKey: "name") 
          medicine.setValue(amount, forKey: "amount") 

         } catch let error as NSError{ 
          print(error) 
         } 

         do { 
          try self.context.save() 
          self.tableView.reloadData() 
         } catch let error as NSError { 
          print("Could not save \(error), \(error.userInfo)") 
         } 
       } 
      } 
     } 
    } 
} 

從核心數據

func fetchFromCoreData() { 

    do { 
     let results = try context.executeFetchRequest(fetchRequest) 
     medicines = results as! [Medicine] 
    } catch let error as NSError { 
     print("Could not fetch \(error), \(error.userInfo)") 
    } 


} 

獲取數據我把在viewWillAppear中:

if Reachability.isConnectedToNetwork() { 
     //fetching data from Parse 

     fetchFromParse() 
     fetchFromCoreData() 
     tableView.reloadData() 

    } else { 
     //fetching data from Core data 
     fetchFromCoreData() 
     logOutButton.enabled = false 

    } 

但它不工作。任何建議如何修復它?

回答

0

你有種一切,只是沒有掛鉤。在執行並檢查獲取之前,您不應該實例化並插入新對象。您目前執行抓取,但不檢查是否有重複。這兩個問題都需要解決,大致如下:

let entity = NSEntityDescription.entityForName("Medicine", inManagedObjectContext: context) 
let query = PFQuery(className: "Medicine") 
query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in 
    if error == nil { 
     for object in objects! { 

      if let name = object["medicineName"] as? String, 
       amount = object["amountQuantity"] as? String { 

        let predicate = NSPredicate(format: "name = %@", name) 
        self.fetchRequest.predicate = predicate 

        do{ 
         let fetchedEntities = try self.context.executeFetchRequest(self.fetchRequest) as! [Medicine] 
         //save to Core Data 

         if fetchedEntities.count <= 0 { 
          let medicine = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: self.context) 
          medicine.setValue(name, forKey: "name") 
          medicine.setValue(amount, forKey: "amount") 
         } 
        } catch let error as NSError{ 
         print(error) 
        } 
      } 
     } 

     do { 
       try self.context.save() 
     } catch let error as NSError { 
       print("Could not save \(error), \(error.userInfo)") 
     } 
    } 
} 
+0

它沒有工作。它一次又一次地保存同名的實體 – kiuzio2

+0

在謂詞中的錯字,我們想檢查沒有匹配,沒有差異。更正了在答案 – Wain

+0

它的工作原理!你能告訴我爲什麼在同一時間我無法獲取數據並在tableView中看到它們嗎?只有在第二次啓動應用程序後? – kiuzio2