核心数据/ Swift 3 - Nil值随机添加到核心数据NSManagedObject

时间:2016-09-30 11:40:57

标签: ios swift core-data swift3

我有一个核心数据模型用于保存我的spritekit游戏的排行榜 但是,出于某种原因,当我第一次运行游戏时,它传递到排行榜的表视图控制器时发生错误。

在添加断点并尝试调试之后,我发现由于某种原因,核心数据模型中已经存在一组数据,其中nil值表示错误。

我在打印出用于保存数据的NSManagedObject后发现了这一点,
下图显示了我的意思:

enter image description here

我的问题是我在任何时候都没有添加这些值。
但是,每次应用程序运行时它们都会出现。
我已经多次查看我的代码,似乎无法找到它为什么不断添加。
这并不是强制解开值这么简单,因为这样做所有这一切都不会在运行代码时出错。

但是,在填充表视图时,它仍然显示一组等于nil的数据,这是我不能拥有的。

我的代码如下:

应用代表

lazy var persistentContainer: NSPersistentContainer = {
    let container = NSPersistentContainer(name: "ScoreModel")
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {
            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
    return container
}()

// MARK: - Core Data Saving support

func saveContext () {
    let context = persistentContainer.viewContext
    if context.hasChanges {
        do {
            try context.save()
        } catch {
            let nserror = error as NSError
            fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
        }
    }
}

排行榜桌面视图控制器Swift文件

import CoreData

class LeaderboardTableVC: UITableViewController {

var finishedGame = 0 
var gameScore:Int! = 0
var name:String!
var date:String!
var score:Int!
var scoreData = [NSManagedObject]()

override func viewWillAppear(_ animated: Bool) {

    self.navigationController?.isNavigationBarHidden = false
    self.navigationItem.hidesBackButton = true

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let managedContext = appDelegate.persistentContainer.viewContext
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Scores")
    let sortDescriptor = NSSortDescriptor(key: "date", ascending: false)
    fetchRequest.sortDescriptors = [sortDescriptor]

        do {
            let results = try managedContext.fetch(fetchRequest)
            scoreData = results as! [NSManagedObject]
            print(scoreData)
            for result in results as! [NSManagedObject] {

                name = result.value(forKey: "name") as? String
                date = result.value(forKey: "date") as? String
                score = result.value(forKey: "score") as? Int

                }

        } catch let error as NSError {
            print("Could not fetch \(error), \(error.userInfo)")
        }

    self.tableView.reloadData()

}

知道为什么会发生这种情况以及如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

在CoreData中,定义在实体中的所有属性在创建时都包含在实体的每个实例中。如果属性被定义为可选,则可以创建实体的实例而不指定属性的值,并且属性的值将为nil - 就像在类定义中名称和日期变量的值从nil开始一样包括在内。从这个意义上讲,您通过创建NSManagedObject实例的行为添加了nil值。

由于这几乎是不可避免的,因此您需要1)在添加实体实例时向字段添加值(并且您可以通过使这些非可选来强制您的手),或2)添加警卫或测试以避免在属性字段为零时尝试解包。

相关问题