Я новичок в Базовые данные , и, хотя это медленно приобретает смысл, у меня проблема с загрузкой моей исходной базы данных , когда я оставляю 'необязательные' отношения значения без значений (разве это не то, что делают дополнительные функции?).Следующий код работает, но не в том случае, если я пропускаю некоторые случаи, когда создаются экземпляры и определяются отношения (точные детали приведены ниже).
Я использую класс для загрузки данных через цикл 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 .Для записей CellData, определенных в случаях от 0 до 27 и от 28 до 51 , я использую предикат для создания конкретной записи 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 не должны иметь отношения, но если значение не назначено, код выполняется нормально - до вызова значения БД.При проверке Gender вводится нормально, но в Cell не вводятся записи CellData, поэтому происходит сбой, при этом объект не найден в разделе 0 индекса 0.
В журнале нет ошибок;и я могу напечатать внутри loadCellData!?!Что происходит?!?