Как я могу удалить родительский объект области вместе со всеми его дочерними объектами? - PullRequest
1 голос
/ 09 февраля 2020
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")
}





 override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {

            if editingStyle == .delete {
                try! realm.write {

                    if days?[indexPath.section].workout[indexPath.row].exercise[indexPath.row] != nil {
                        realm.delete(((days?[indexPath.section].workout[indexPath.row].exercise[indexPath.row].wsr)!))
                        realm.delete(((days?[indexPath.section].workout[indexPath.row].exercise)!))
                        realm.delete((days?[indexPath.section].workout[indexPath.row])!)
                    } else {
                        realm.delete((days?[indexPath.section].workout[indexPath.row])!)
                    }


                    tableView.beginUpdates()

                    tableView.deleteRows(at: [indexPath], with: .automatic)

                    if days?[indexPath.section].workout.isEmpty == true {
                        realm.delete((days?[indexPath.section])!)
                        let indexSet = IndexSet(arrayLiteral: indexPath.section)
                        tableView.deleteSections(indexSet, with: .automatic)
                    }

                    tableView.endUpdates()
                }
            }
        }

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

Способ его настройки прямо сейчас, когда существует несколько дочерних объектов. в родительском объекте, и я проводю, чтобы удалить этот родительский объект, удаляется только один из дочерних объектов.

Как я могу удалить все дочерние объекты?

1 Ответ

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

На этот вопрос есть многочисленные ответы; от чтения в тренировках из объекта списка дней и итерации по ним для удаления каждого запроса, соответствующего дням, и затем удаления

Давайте сделаем запрос. Объекты областей загружаются лениво, поэтому, если их 10 или 10 000, влияние на память будет минимальным и позволит избежать итерации, которую l oop мог бы замедлить пользовательский интерфейс.

Первое, на что нужно обратить внимание, - это обратная связь между Дни и их родительские объекты Workout.

Мы можем использовать это отношение, чтобы выбрать, какие тренировки принадлежат к каким дням, а затем удалить их.

Во-вторых, realm.delete может быть передан за один раз. удаляемый объект или последовательность объектов .

Вот код. Я не знаю, какие объекты дня и тренировок вы хотите удалить, поэтому я собираюсь удалить тренировки, которые go с объектом первого дня.

if let day = realm.objects(Days.self).first {
    let thisDaysWorkouts = realm.objects(Workouts.self).filter("ANY parentDay == %@", day)
    try! realm.write {
        realm.delete(thisDaysWorkouts)
    }
}

После того, как они будут удалены, вы можете удалить родительский объект.

Обратите внимание, что в настоящее время в Realm нет каскадного удаления.

В качестве несвязанного примечания, вы можете рассмотреть возможность предоставления своим объектам Первичных ключей . Это поможет организации в долгосрочной перспективе по мере роста проекта.

...