如何删除领域父对象及其所有子对象?
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。随着项目的发展,它将在长期 运行 中帮助组织。
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。随着项目的发展,它将在长期 运行 中帮助组织。