Как фильтровать по значению родителя при удалении нескольких дочерних объектов в области? - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь удалить все объекты WSR, связанные со всеми объектами Exercise в конкретном объекте тренировки.

У меня просто возникли проблемы с фильтрацией всех объектов WSR. Как это настроено прямо сейчас, если у меня есть несколько объектов Exercise, удаляются только значения WSR, связанные с первым объектом Exercise, но не остальные.

Как можно отфильтровать все связанные объекты WSR со всеми объектами упражнений в рамках определенной тренировки?

class Days : Object {
    @objc dynamic var weekday : String = ""

    let workout = List<Workouts>()
}

class Workouts : Object {
    @objc dynamic var title : String = ""
    var parentDay = LinkingObjects(fromType: Days.self, property: "workout")

    let exercise = List<Exercises>()
}

class Exercises : Object {
    @objc dynamic var exerciseName : String = ""

    var parentWorkout = LinkingObjects(fromType: Workouts.self, property: "exercise")

    let wsr = List<WeightSetsReps>()
}

class WeightSetsReps : Object {
    @objc dynamic var weight = 0
    @objc dynamic var reps = 0
    var parentExercise = LinkingObjects(fromType: Exercises.self, property: "wsr")
}

if days?[indexPath.section].workout[indexPath.row].exercise.isEmpty == false {

    if let selectedWorkout = days?[indexPath.section].workout[indexPath.row] {
        let thisWorkoutsExercises = realm.objects(Exercises.self).filter("ANY parentWorkout == %@", selectedWorkout)
        // Filter function to get all wsr's associated with the selected workout...
        let thisWorkoutsWsr = realm.objects(WeightSetsReps.self).filter("ANY parentExercise == %@", days?[indexPath.section].workout[indexPath.row].exercise[indexPath.row])

        realm.delete(thisWorkoutsWsr)
        realm.delete(thisWorkoutsExercises)
        realm.delete((days?[indexPath.section].workout[indexPath.row])!)
    }
} else {
    realm.delete((days?[indexPath.section].workout[indexPath.row])!)
}

1 Ответ

1 голос
/ 10 февраля 2020

Проблема в этой строке:
let thisWorkoutsWsr = realm.objects(WeightSetsReps.self).filter("ANY parentExercise == %@", days?[indexPath.section].workout[indexPath.row].exercise[indexPath.row])

Используя ANY parentExercise == ... .exercise[indexPath.row]), вы запрашиваете только WSR из упражнения с одним индексом. В любом случае, это может даже сократить sh, если это количество тренировок меньше, чем количество дней тренировок.
Используя оператор ANY .. IN .., вы запрашиваете все упражнения в массиве exercise.

Попробуйте это:

    guard let workout = days?[indexPath.section].workout[indexPath.row] else { return }
    if workout.exercise.isEmpty {  
        realm.delete(workout)
        return
    }


    let thisWorkoutsExercises = realm.objects(Exercises.self).filter("ANY parentWorkout == %@", workout)
    // Filter function to get all wsr's associated with the selected workout...
    let thisWorkoutsWsr = realm.objects(WeightSetsReps.self).filter("ANY parentExercise IN %@", thisWorkoutsExercises)

    realm.delete(thisWorkoutsWsr)
    realm.delete(thisWorkoutsExercises)
    realm.delete(workout)
...