ios - 使用 NSPredicate 将对象保存到核心数据

标签 ios swift core-data parse-platform

我正在尝试将一个对象保存到从 Parse 获取的核心数据中,但我只想要那些不包含数据库中已存在名称的对象:

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

关于ios - 使用 NSPredicate 将对象保存到核心数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33457013/

相关文章:

ios - Swift 如何使用枚举获取字符串值

ios - 如何关闭模态视图 Controller ,然后立即让呈现 View Controller 呈现不同的模态视图 Controller ?

ios - 为 Collection View 中的单元格设置偏移量或初始位置

swift - 无法使用 firebase 创建新用户。我不断收到错误消息 "updateChildValues: at/failed: permission_denied"

iOS - 在更新到新版本时保留旧的 sqlite 数据库

ios - 每 X 小时重复一次推送通知

swift - 如何使用 swift codable 根据特定排序顺序对自定义对象进行排序

谓词表达式中的 iOS Core Data 二元运算

ios - swift : How to avoid duplicate entries in CoreData for implementation with JSON array?

ios - [UIScreen mainScreen].bounds 在 iPhone 6 启动时改变它的大小