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

时间:2020-02-09 01:49:05

标签: swift realm tableview

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 个答案:

答案 0 :(得分:0)

这个问题有很多答案;从“天数列表”对象中读取锻炼内容,然后遍历它们以删除每个锻炼对象,从-到-查询匹配锻炼的天数,然后删除

让我们进行查询。领域对象是延迟加载的,因此,如果有10个或10,000个,则对内存的影响将最小,并且将避免迭代循环会降低UI速度。

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

我们可以利用这种关系来选择哪些锻炼属于哪些日期,然后将其删除。

第二件事是,可以将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。从长远来看,它将随着项目的发展对组织产生帮助。