我是核心数据的新手,虽然它很有意义,但当我保留“可选” 数据库时遇到了问题> 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里面打印!!!怎么了?!?
答案 0 :(得分:0)
基本上,CoreData中的可选值与Swift可选值不同。整数永远不应该是可选的,关系也应该是可选的。要解决此问题,至少应为整数分配一个不可能的值,而不是nil,并用于检查是否分配了值。
虽然我知道这很昂贵,但是我没有找到一种无需单独获取记录就可以将关系分配给CoreData中现有记录的方法。