gpt4 book ai didi

ios - 如果没有可选关系属性的值,核心数据无法加载?!?迅速

转载 作者:行者123 更新时间:2023-11-29 05:40:14 28 4
gpt4 key购买 nike

我是核心数据的新手,虽然它正在慢慢变得有意义,但当我保留“可选”时,我在加载初始数据库时遇到了问题>没有值的关系值(这不是选项的作用吗?)。下面的代码可以工作,但如果我省略了一些实例化和定义关系的情况(具体细节如下),则不行。

我正在使用一个类通过 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 条目,我使用谓词来实例化特定的性别条目...

    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 中打印!?!这是怎么回事?!?

最佳答案

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

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

关于ios - 如果没有可选关系属性的值,核心数据无法加载?!?迅速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56629024/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com