如何删除领域父对象及其所有子对象?

How can I delete a realm parent object along with all of its child objects?

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 时删除父对象及其所有相关子对象。

现在的设置方式,当父对象中有多个子对象时,我滑动删除那个父对象,只有一个子对象被删除。

如何删除所有子对象?

这个问题有很多答案;从 Days' List 对象中读取锻炼并迭代它们以删除每一个 - 到 - 查询匹配锻炼的日子,然后删除

我们来查询一下。 Realm 对象是延迟加载的,所以如果有 10 或 10,000 个,内存影响将是最小的,并且将避免迭代循环可能会减慢 UI.

首先要注意的是,Days 与其父 Workout 对象之间存在反比关系。

我们可以利用这种关系 select 哪些锻炼属于哪些日子,然后删除它们。

第二件事是 realm.delete 可以传递要删除的单个对象或 对象序列 .

这是代码。我不知道你要删除哪一天和锻炼对象,所以我要删除与第一天对象一起的锻炼。

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 目前没有级联删除。

作为一个不相关的旁注,您可能需要考虑提供您的对象 Primary Keys。随着项目的发展,它将在长期 运行 中帮助组织。