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
时删除父对象及其所有相关子对象。
现在的设置方式是,当父对象中有多个子对象,而我滑动以删除该父对象时,只有一个子对象被删除。
如何删除所有子对象?
答案 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。从长远来看,它将随着项目的发展对组织产生帮助。