簡體   English   中英

使用NSPredicate將對象保存到核心數據

[英]Saving object to core data with NSPredicate

我正在嘗試將一個對象保存到從Parse獲取的Core Data中,但是我只希望那些不包含數據庫中已經存在的名稱的對象:

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

    }

但這是行不通的。 有什么建議如何修復嗎?

您幾乎擁有所有東西,只是沒有聯系上。 在執行並檢查提取之前,您不應該實例化並插入新對象。 您當前正在執行提取操作,但不檢查是否存在重復項。 這兩個問題都需要解決,類似於:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM