swift - NSPredicate和Context Save工作不正常

时间:2017-06-25 12:01:37

标签: ios iphone swift nspredicate

我有一个检查核心数据的功能。如果不存在它应该写入其中(但它不能以这种方式工作)SoundItems是一个包含被收藏对象的数组,而mainArray是包含真实对象的数组;

   @IBAction func Favori(_ sender: Any) {
        // save core data
        let app = UIApplication.shared.delegate as! AppDelegate
        let context = app.persistentContainer.viewContext
        let newSound = NSEntityDescription.entity(forEntityName: "Sounds", in: context)
        let sound = NSManagedObject(entity: newSound!, insertInto: context)
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Sounds")

        let predicate = NSPredicate(format: "soundName = %@", soundArray[soundIndex].deletingPathExtension().lastPathComponent)
        fetchRequest.predicate = predicate
        do {
         let fetchResults = try context.fetch(fetchRequest) as? [Sounds]
              if fetchResults!.count > 0 {

                print("already favd")
            }
         else {

               sound.setValue(soundArray[soundIndex].deletingPathExtension().lastPathComponent, forKey: "soundName")
                    try context.save()
                        soundItems.append(sound)
                            print(sound)

            }
        }

        catch {
        print(error)
        }
    }

以下是列出核心数据的代码;

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell")! as UITableViewCell
    let sound = soundItems[indexPath.row]
    cell.textLabel?.text = sound.value(forKey: "soundName") as? String

    return cell

}

我尝试在调试模式下运行代码,当没有重复的核心数据并添加到tableView列表中时,它可以正常工作。 但这是情况;当核心数据存在时(fetchResults!.count&gt; 0)仍然在tableview中添加为nil label.text但总是添加mainArray [0]的项目

2 个答案:

答案 0 :(得分:1)

如果您想检查声音是否在收藏夹中,如果没有添加新声音,则必须更改步骤的顺序

@IBAction func Favori(_ sender: Any) {
    // save core data
    let app = UIApplication.shared.delegate as! AppDelegate
    let context = app.persistentContainer.viewContext

    let fetchRequest : NSFetchRequest<Sounds> = Sounds.fetchRequest()
    let favName = soundArray[soundIndex].deletingPathExtension().lastPathComponent
    let predicate = NSPredicate(format: "soundName = %@", favName)
    fetchRequest.predicate = predicate
    do {
        let fetchResults = try context.fetch(fetchRequest)
        if fetchResults.isEmpty {
            let newSound = NSEntityDescription.insertNewObject(forEntityName: "Sounds", into:context) as! Sounds
            newSound.soundName = favName
            try context.save()
            soundItems.append(newSound)
            print(newSound)
        }
        else {
             print("already favd")
        }
    }

    catch {
        print(error)
    }
}

建议以单数形式命名实体(Sound)。

答案 1 :(得分:0)

@vadian说得好。为什么在获取数据之前插入新声音?

 let newSound = NSEntityDescription.entity(forEntityName: "Sounds", in: context)
 let sound = NSManagedObject(entity: newSound!, insertInto: context)