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



我是Core Data的新手,虽然它慢慢有意义,但当我将"可选">关系值保留为没有值时,我在加载初始数据库时遇到了问题(这不是可选的作用吗?以下代码有效,但如果我省略了一些实例化和定义关系的情况,则无效(下面的确切细节)。

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

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 循环定义值和传递,以将上下文保存在实体 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
}
...

。它被传递到方法中以将数据放入上下文中并保存到核心数据中。

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 不应该有关系,但是如果没有分配任何值,代码将正常执行 - 直到调用数据库值。在检查时,性别输入正常,但没有 CellData 条目输入到数据库中,因此它崩溃,在索引 0 部分 0 处找不到对象。

日志中没有错误;我可以在loadCellData中打印?!这是怎么回事?!?

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

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

最新更新