没有可选关系属性值的情况下无法加载核心数据?迅速

时间:2019-06-17 10:04:35

标签: ios core-data relationship

我是核心数据的新手,虽然它很有意义,但当我保留“可选” 数据库时遇到了问题> relationship 不含值的值(这不是可选的选项吗?)。以下代码有效,但如果我省略了一些实例化并定义关系的情况,则不会(以下详细信息)。

我正在使用一个类,通过for循环来加载数据,该循环分配初始化值,并将其传递给有效加载数据的方法。首先,加载一个名为Gender的实体。

class LoadData
{
init ()
{
    for count in 0...3
    {
        var text = "Value not found"
        let sortOrder: Int32 = Int32(count)

        switch count
        {
        case 0:
            text = "Masculine"
        case 1:
            text = "Neutral"
        case 2:
            text = "Feminine"
        case 3:
            text = "Plural"
        default:
            text = "Value unassigned"
        }
        loadGender(text: text, sortOrder: sortOrder)
    }

在相同的类和init中,单独的for循环定义值并传递以将上下文保存在 Entity CellData 中。对于在情况0到27和28到51 中定义的CellData条目,我使用谓词来实例化特定的Gender条目...

    for count in 0...51
    {
        var text = "Cell text not found"
        ...
        var dataToGender: Gender? = nil


        switch count
        {
        case 0...27:     // HERE - if case 1...27, data will NOT load

            guard let appDelegate = UIApplication.shared.delegate as? AppDelegate
                else { return }
            let moc = appDelegate.persistentContainer.viewContext
            let request = NSFetchRequest<Gender>(entityName: "Gender")

            let genderToFetch = "Masculine"
            request.predicate = NSPredicate(format: "text == %@", genderToFetch)

            do
            {
                let fetched = try moc.fetch(request)
                dataToGender = fetched[0] as Gender
            } catch
            { fatalError("Failed to fetch employees: \(error)") }

        case 28...51:
            guard let appDelegate = UIApplication.shared.delegate as? AppDelegate
                else { return }     // get the app delegate
            let moc = appDelegate.persistentContainer.viewContext
            let request = NSFetchRequest<Gender>(entityName: "Gender")

            let genderToFetch = "Feminine"
            request.predicate = NSPredicate(format: "text == %@", genderToFetch)

            do
            {
                let fetched = try moc.fetch(request)
                dataToGender = fetched[0] as Gender
            } catch
            { fatalError("Failed to fetch employees: \(error)") }

        default: return
        }

        ...

...,它被传递到方法中以将数据放入上下文并保存到Core Data。

func loadCellData(text: String, sortOrder: Int32, portion: Float, color1: String?, color2: String?, color3: String?, colorRangeLoc1: Int32?, colorRangeLoc2: Int32?, colorRangeLoc3: Int32?, colorRangeLen1: Int32?, colorRangeLen2: Int32?, colorRangeLen3: Int32?, underlineRangeLoc1: Int32?, underlineRangeLoc2: Int32?, underlineRangeLoc3: Int32?, underlineRangeLen1: Int32?, underlineRangeLen2: Int32?, underlineRangeLen3: Int32?, dataToGender: NSObject?)
{
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let context = appDelegate.persistentContainer.viewContext

    let entry: CellData = NSEntityDescription.insertNewObject(forEntityName: "CellData", into: context) as! CellData
    ...
    entry.text = text
    ...
    entry.dataToGender = dataToGender as? Gender

    do { try context.save() ; print("saved")}
    catch let error as NSError
    { print("Could not save. \(error), \(error.userInfo)") }
}

令人惊奇的是,这可以正常工作-但前提是我为所有CellData条目定义了一种关系。但是,我不希望所有条目都具有关系(请参阅注释//这里)。情况0 ... 7应该没有关系,但是如果未分配任何值,则代码将正常执行-直到调用DB值为止。经过检查,Gender可以正常输入,但没有在数据库中输入任何CellData条目,因此它崩溃了,在索引0的第0部分找不到对象。

日志中没有错误;我可以在loadCellData里面打印!!!怎么了?!?

1 个答案:

答案 0 :(得分:0)

基本上,CoreData中的可选值与Swift可选值不同。整数永远不应该是可选的,关系也应该是可选的。要解决此问题,至少应为整数分配一个不可能的值,而不是nil,并用于检查是否分配了值。

虽然我知道这很昂贵,但是我没有找到一种无需单独获取记录就可以将关系分配给CoreData中现有记录的方法。