删除一对多关系
Deleting with one-to-many relationship
我有一个一对多的关系:
class GameSystem: Object {
dynamic var gameSystemName = ""
}
class games: Object {
dynamic var gameSystemName = gameSystemName().name
dynamic var gameTitle = ""
dynamic var gameGenre = ""
}
gameSystemName
当前显示在 TableView 上。如果用户删除 gameSystemName
,我希望 gameSystemName
连同该系统的所有游戏一起删除。
我目前使用的代码只会删除GameSystem
,但保留所有游戏。
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)
}
我假设有一种简单的方法可以做到这一点。
如果您保持模型不变,解决方案是首先查询关系 Game
:
的相关对象
// …
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)
}
// …
型号推荐
我建议您向模型中添加显式 link,而不是通过松散的 linked 外键来表达关系。但是对象映射是非常个人化的,可能取决于超出您的问题和此答案范围的进一步限制。为了进一步参考,如下所示:
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
}
}
如果你这样设置你的模型,你可以很容易地删除你的游戏:
// …
let objectToDelete = gameSystems[indexPath.row]
realm.write {
realm.delete(objectToDelete.games)
realm.delete(objectToDelete)
}
// …
注意: 未来,Realm 将带来级联删除功能。一旦发布,您甚至不需要手动删除相关游戏,而是能够在您的模型中声明强关系,以便自动删除游戏。
备选方案Link声明
您也可以声明您的 link 反之亦然,但这会使将来使用像级联删除这样的功能变得更加困难。但是,现在删除它们的代码看起来与上面相同。
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
}
删除Parent和REALM SWIFT中的children非常简单...只需要写一小段代码即可。
我在这里尝试删除名为 "Swift" 的主要类别,每当我的主要类别被删除时,所有子类别也会被删除...
do{
try realm.write({
realm.delete(Category.items)
realm.delete(Category)
})
}catch{
print("ERROR WHILE DELETING CELL ::: \(error)")
}
简而言之,要删除子类别,您只需在 之后放置 "items"。后跟 parent 姓名。
我有一个一对多的关系:
class GameSystem: Object {
dynamic var gameSystemName = ""
}
class games: Object {
dynamic var gameSystemName = gameSystemName().name
dynamic var gameTitle = ""
dynamic var gameGenre = ""
}
gameSystemName
当前显示在 TableView 上。如果用户删除 gameSystemName
,我希望 gameSystemName
连同该系统的所有游戏一起删除。
我目前使用的代码只会删除GameSystem
,但保留所有游戏。
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)
}
我假设有一种简单的方法可以做到这一点。
如果您保持模型不变,解决方案是首先查询关系 Game
:
// …
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)
}
// …
型号推荐
我建议您向模型中添加显式 link,而不是通过松散的 linked 外键来表达关系。但是对象映射是非常个人化的,可能取决于超出您的问题和此答案范围的进一步限制。为了进一步参考,如下所示:
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
}
}
如果你这样设置你的模型,你可以很容易地删除你的游戏:
// …
let objectToDelete = gameSystems[indexPath.row]
realm.write {
realm.delete(objectToDelete.games)
realm.delete(objectToDelete)
}
// …
注意: 未来,Realm 将带来级联删除功能。一旦发布,您甚至不需要手动删除相关游戏,而是能够在您的模型中声明强关系,以便自动删除游戏。
备选方案Link声明
您也可以声明您的 link 反之亦然,但这会使将来使用像级联删除这样的功能变得更加困难。但是,现在删除它们的代码看起来与上面相同。
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
}
删除Parent和REALM SWIFT中的children非常简单...只需要写一小段代码即可。
我在这里尝试删除名为 "Swift" 的主要类别,每当我的主要类别被删除时,所有子类别也会被删除...
do{
try realm.write({
realm.delete(Category.items)
realm.delete(Category)
})
}catch{
print("ERROR WHILE DELETING CELL ::: \(error)")
}
简而言之,要删除子类别,您只需在 之后放置 "items"。后跟 parent 姓名。