Swift 使用一对多关系删除
我有一对多的关系:Swift 使用一对多关系删除,swift,realm,Swift,Realm,我有一对多的关系: class GameSystem: Object { dynamic var gameSystemName = "" } class games: Object { dynamic var gameSystemName = gameSystemName().name dynamic var gameTitle = "" dynamic var gameGenre = "" } gameSystemNames当前显示在TableView上。如果用户删除了一个gameSyst
class GameSystem: Object {
dynamic var gameSystemName = ""
}
class games: Object {
dynamic var gameSystemName = gameSystemName().name
dynamic var gameTitle = ""
dynamic var gameGenre = ""
}
gameSystemName
s当前显示在TableView上。如果用户删除了一个gameSystemName
,我希望该gameSystemName
与该系统的所有游戏一起被删除
我当前使用的代码只会删除游戏系统
,但会保留所有游戏
func deleteRowAtIndexPath(indexPath: NSIndexPath) {
let realm = Realm()
let objectToDelete = gameSystems[indexPath.row]
realm.write {
realm.delete(objectToDelete)
}
gameSystemTableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
gameSystems = Realm(path: Realm.defaultPath).objects(GameSystem)
}
我假设有一种简单的方法可以做到这一点。如果保持模型不变,解决方案是首先查询关系
游戏的相关对象:
// …
let objectToDelete = gameSystems[indexPath.row]
let gameSystemName = objectToDelete.gameSystemName
realm.write {
let games = realm.objects(Game).filter("gameSystemName = ?", gameSystemName)
realm.delete(games)
realm.delete(objectToDelete)
}
// …
模型推荐
我建议您向模型添加一个显式链接,而不是通过一个松散链接的外键来表达这种关系。但是对象映射是非常独立的,可能取决于超出您的问题和答案范围的进一步约束。供进一步参考,如下所示:
class GameSystem : Object {
dynamic var name = ""
let games = List<Game>()
}
class Game : Object {
dynamic var title = ""
dynamic var genre = ""
// Use a backlink
// (https://realm.io/docs/swift/latest/#inverse-relationships)
dynamic var gameSystem: GameSystem? {
return linkingObjects(GameSystem.self, forProperty: "games").first
}
}
注意:在将来,Realm将把级联删除作为一个特性。一旦发布,您甚至不需要手动删除关联的游戏,而是可以在模型中声明强关系,以便自动删除游戏
备选链接声明
您也可以声明链接,反之亦然,但这可能会使将来更难使用级联删除之类的功能。但是,现在删除它们的代码看起来与上面相同
class GameSystem : Object {
dynamic var name = ""
// Use a backlink
// (https://realm.io/docs/swift/latest/#inverse-relationships)
dynamic var games: [Game] {
return linkingObjects(Game.self, forProperty: "gameSystem")
}
}
class Game : Object {
dynamic var title = ""
dynamic var genre = ""
let gameSystem: GameSystem? = nil
}
这是非常容易删除家长以及孩子在领域迅速。。。你只需要写一小段代码
在这里,我试图删除我的主要类别称为“Swift”,每当我的主要类别被删除,所有的子类别也被删除
do{
try realm.write({
realm.delete(Category.items)
realm.delete(Category)
})
}catch{
print("ERROR WHILE DELETING CELL ::: \(error)")
}
简而言之,要删除子类别,您只需将“项”放在后面。然后是父母的名字。马吕斯,我感谢你深思熟虑的回答。谢谢你的帮助!
do{
try realm.write({
realm.delete(Category.items)
realm.delete(Category)
})
}catch{
print("ERROR WHILE DELETING CELL ::: \(error)")
}