核心数据context.save始终使用零单元格添加记录,尽管此类托管对象未添加到上下文中

时间:2019-06-06 14:55:23

标签: ios swift core-data save

我正在编写一个使用Core Data保存电影实体的应用。电影是唯一的实体,并且只有一个属性,名称:字符串。

有两个视图控制器。表VC是导航栏的根,而addMovie VC是通过导航栏上的“ +”按钮进行的​​模态选择。

问题描述:
1)启动应用程序,并从数据库中获取以前保存的电影,以填充表视图。这样就可以了。
2)点击“ +”按钮,启动addMovie VC并添加新电影。此步骤可以。
3)使用textField添加影片。这就是故障所在。输入的影片完美地写入了数据库,但是还添加了一个带有“ name”单元格为零的记录。
4)仅当应用程序从表VC选择到addMovie VC时,才会发生问题。如果您继续在addMovieVC中添加电影一次,则不会向数据库中添加任何nil。如果您回到表VC,然后再次选择addMovie VC,则添加的第一部电影将被完美录制,但还有另一部名称为nil的电影。

enter image description here

这是我的addMovieVC:

class AddMovieViewController: UIViewController, UITextFieldDelegate
{
    var movies: [NSManagedObject] = []
    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var button: UIButton!

func textFieldShouldReturn(_ textField: UITextField) -> Bool
    {
        guard let text = textField.text else
        {
            textField.resignFirstResponder()
            return false
        }
        let trimmedText = text.trimmingCharacters(in: .whitespaces)
        if trimmedText != ""
        {
            self.save(trimmedText)
            textField.text = ""
        }
        textField.resignFirstResponder()
        return true
    }

    func save(_ name: String)
    {
        let coreDataStack = CoreDataStack()
        coreDataStack.movie.setValue(name, forKeyPath: "name")

        do
        {
            try coreDataStack.context.save()
            movies.append(coreDataStack.movie)
        } catch
        {
            print("Save error: \(error)")
        }
    }
}

这就是我的核心数据堆栈的样子:

struct CoreDataStack
{
    let context: NSManagedObjectContext
    let entity: NSEntityDescription
    let movie: NSManagedObject
    let fetchRequest: NSFetchRequest<NSManagedObject>

    init()
    {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        context = appDelegate.persistentContainer.viewContext
        entity = NSEntityDescription.entity(forEntityName: "Movie", in: context)!
        movie = NSManagedObject(entity: entity, insertInto: context)
        fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Movie")
        //let predicate = NSPredicate(format: "name != nil")
        //fetchRequest.predicate = predicate
        fetchRequest.includesPendingChanges = false
        //fetchRequest.returnsObjectsAsFaults = false
    }
}

在CoreDataStack类上注释掉的解决方案无效。
关于如何摆脱零细胞的任何想法?任何帮助将不胜感激。谢谢!

0 个答案:

没有答案