删除 Swift 领域中具有子类的对象
Deleting Objects with subclasses in Swift Realm
我在 Swift Realm 中有一个非常简单的数据库用于待办事项应用程序:
项目及其父类别。
用户可以通过简单的滑动操作删除项目和类别。该操作工作正常,删除项目时没有问题。如果我删除一个类别,那也有效,但我仍然可以在领域浏览器中看到项目,即使不再有父项目,这些项目仍保留在数据库中。显然用户看不到这些,他们什么也没做,但最好用父类别摆脱这些。有什么简单的方法可以做到这一点吗?
class Category: Object{
@objc dynamic var name: String = ""
@objc dynamic var color: String = ""
@objc dynamic var order = 0
let items = List<Item>()
override static func primaryKey() -> String? {
return "order"
}
static func incrementalIDCat() -> Int {
let realm = try! Realm()
return (realm.objects(Category.self).max(ofProperty: "order") as Int? ?? 0) + 1
}
}
class Item: Object {
@objc dynamic var title: String = ""
@objc dynamic var done: Bool = false
@objc dynamic var dateCreated: Date?
@objc dynamic var order = 0
var parentCategory = LinkingObjects(fromType: Category.self, property: "items")
override static func primaryKey() -> String? {
return "order"
}
static func incrementalIDItem() -> Int {
let realm = try! Realm()
return (realm.objects(Item.self).max(ofProperty: "order") as Int? ?? 0) + 1
}
}
override func updateModel(at indexPath: IndexPath) {
if let categoryForDeletion = self.categories?[indexPath.row] {
do {
try self.realm.write {
self.realm.delete(categoryForDeletion)
}
} catch {
print("Error deleting category, \(error)")
}
}
tableView.reloadData()
}
您先删除items
即可。
self.realm.delete(categoryForDeletion.items)
self.realm.delete(categoryForDeletion)
或者,使用 this extension,您可以这样做。
self.realm.delete(categoryForDeletion, cascading: true)
我在 Swift Realm 中有一个非常简单的数据库用于待办事项应用程序:
项目及其父类别。
用户可以通过简单的滑动操作删除项目和类别。该操作工作正常,删除项目时没有问题。如果我删除一个类别,那也有效,但我仍然可以在领域浏览器中看到项目,即使不再有父项目,这些项目仍保留在数据库中。显然用户看不到这些,他们什么也没做,但最好用父类别摆脱这些。有什么简单的方法可以做到这一点吗?
class Category: Object{
@objc dynamic var name: String = ""
@objc dynamic var color: String = ""
@objc dynamic var order = 0
let items = List<Item>()
override static func primaryKey() -> String? {
return "order"
}
static func incrementalIDCat() -> Int {
let realm = try! Realm()
return (realm.objects(Category.self).max(ofProperty: "order") as Int? ?? 0) + 1
}
}
class Item: Object {
@objc dynamic var title: String = ""
@objc dynamic var done: Bool = false
@objc dynamic var dateCreated: Date?
@objc dynamic var order = 0
var parentCategory = LinkingObjects(fromType: Category.self, property: "items")
override static func primaryKey() -> String? {
return "order"
}
static func incrementalIDItem() -> Int {
let realm = try! Realm()
return (realm.objects(Item.self).max(ofProperty: "order") as Int? ?? 0) + 1
}
}
override func updateModel(at indexPath: IndexPath) {
if let categoryForDeletion = self.categories?[indexPath.row] {
do {
try self.realm.write {
self.realm.delete(categoryForDeletion)
}
} catch {
print("Error deleting category, \(error)")
}
}
tableView.reloadData()
}
您先删除items
即可。
self.realm.delete(categoryForDeletion.items)
self.realm.delete(categoryForDeletion)
或者,使用 this extension,您可以这样做。
self.realm.delete(categoryForDeletion, cascading: true)