Я пытаюсь получить первое или текущее упражнение из своих основных данных, но Swift продолжает говорить мне, что элемент пуст. Когда я запускаю приложение и устанавливаю точки останова, отладчик показывает, что элемент пуст, но без ошибок. вот функции, которые я использую для получения данных элемента.
func currentWorkout() -> Workout? {
let client = currentClient()
return (appointment?.workouts as? Set<Workout>)?.first(where: { $0.client == client })
}
private func currentCard() -> Card? {
return currentWorkout()?.card
}
private func currentClientPlannedExercises() -> [ExerciseInfo] {
if let currentCard = currentCard(), let template = currentCard.template, let exerciseSets = template.exerciseSets?.array as? [ExerciseSet] {
let numCardsWithThis = (template.cardsWithThisTemplate as? Set<Card>)?.filter { $0.client != currentClient() }.count ?? 0
let exercsiseSetNumber = numCardsWithThis % exerciseSets.count
if let result = exerciseSets[exercsiseSetNumber].exercises?.array as? [ExerciseInfo] {
return result
}
}
return [ExerciseInfo]()
}
private func currentExercise() -> Exercise? {
// we can't have an exercise without a selection
guard let selectedExercise = currentExerciseInfo(), let currentCard = currentCard() else{
return nil
}
// get the first exercise on the current card that has the same exercise info as the one selected
if let exercises = currentWorkout()?.exercises as? Set<Exercise>{
return exercises.first(where: { $0.exerciseInfo == selectedExercise })
}
let exercise = Exercise(context: context)
exercise.workout = currentWorkout()
exercise.exerciseInfo = selectedExercise
//TODO: Set Seat
return exercise
}
private func currentExerciseInfo() -> ExerciseInfo? {
guard let selectedRow = exercisesTableView.indexPathForSelectedRow else {
return nil
}
return currentClientPlannedExercises()[selectedRow.row]
}
либо это, либо они не сохраняются в основные данные
Добавлен ответ для извлечения данных из основных данных My Way. Надеюсь, это поможет, если проблема в добавлении, я знаю, что я обновлю код для вас.
В чем проблема?





если проблема возникает, вы можете использовать этот код:
Для получения данных из Core Data
var tasks: [Task] = [] //Your Entity Name in Bracket
func getData() {
do {
tasks = try context.fetch(Task.fetchRequest()) //Instead of Task your Entity Name
} catch {
print("Fetching Failed")
}
}
И используйте это так:
for data in tasks{
print(data.name) // All the Attributes name after data.attributename
print(data.address)
}
Если он находится в tableView:
let data = tasks[indexPath.row]
print(data.name)
Вы получите данные, если они есть.
Распечатайте путь следующим образом:
let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
print(paths[0])
Перейдите в файл sqlite, откройте и проверьте, есть ли внутри него данные.
Простой код для добавления данных
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let task = Task(context: context) //Entity Name here instead of Task
task.name = taskTextField.text! // Attribute name here after task.attributename
// Save the data to coredata
(UIApplication.shared.delegate as! AppDelegate).saveContext()
Надеюсь на эту помощь.
Итак, пока приложение работает, я наведен на элемент и элементы в функции currentExercise, и они не имеют значения.
Итак, я предполагаю, что значение не вводится
но я вижу это изменение в функции textFieldDidBeginEditing
Вы пробовали мою функцию для извлечения данных из основных данных? Отредактировал ответ, чтобы проверить данные прямо в БД
Я посмотрел данные и ничего не сохранил. Функция, которую вы мне дали, никогда не запускается при запуске приложения
@MattBrown Отредактировал ответ, чтобы сохранить данные по-моему, я почти использую это в каждом проекте, и он работает как шарм. Попробуйте сохранить, используя это, и получить, используя мой способ. Если это сработает для вас, не забудьте принять мой ответ. ваше здоровье!
Я обнаружил, что проблема заключалась в функции currentExercise, которая не вызывала первое упражнение, пока не было выполнено упражнение. Я исправил, переписав строку, если let упражнения = currentWorkout () ?. упражнения как? Установите <Exercise>, пусть firstExercise = plays.first (где: {$ 0.exerciseInfo == selectedExercise}) {return firstExercise
В любом случае, если это помогло вам, то вы можете одобрить мой ответ на это. Помог вам в обнаружении шагов
Я обнаружил, что проблема заключалась в функции currentExercise, которая не вызывала первое упражнение, пока не было выполнено упражнение. Исправил переписав функцию
private func currentExercise() -> Exercise? {
// we can't have an exercise without a selection
guard let selectedExercise = currentExerciseInfo() else{
return nil
}
// get the first exercise on the current card that has the same exercise info as the one selected
if let exercises = currentWorkout()?.exercises as? Set<Exercise>, let firstExercise = exercises.first(where: { $0.exerciseInfo == selectedExercise }) {
return firstExercise
}
let exercise = Exercise(context: context)
exercise.workout = currentWorkout()
exercise.exerciseInfo = selectedExercise
//TODO: Set Seat
return exercise
}
Столкнулись с проблемой при извлечении данных из основных данных, верно?