删除一对多关系

ult*_*lex 3 realm swift

我有一对多的关系:

class GameSystem: Object {
dynamic var gameSystemName = ""
}

class games: Object {
dynamic var gameSystemName = gameSystemName().name
dynamic var gameTitle = ""
dynamic var gameGenre = ""
}
Run Code Online (Sandbox Code Playgroud)

gameSystemNames的当前显示上的TableView.如果用户删除了a 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)
}
Run Code Online (Sandbox Code Playgroud)

我假设有一个简单的方法来做到这一点.

mar*_*ius 6

如果保持模型不变,解决方案是首先查询关系的相关对象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)
}
// …
Run Code Online (Sandbox Code Playgroud)

模型推荐

我建议你添加一个显式链接到你的模型,而不是通过松散链接的外键表达关系.但是对象映射非常个性化,并且可能依赖于超出问题范围和此答案的进一步约束.如需进一步参考,如下所示:

 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
      }
 }
Run Code Online (Sandbox Code Playgroud)

如果你设置这样的模型,你可以很容易地删除你的游戏:

// …
let objectToDelete = gameSystems[indexPath.row]
realm.write {
    realm.delete(objectToDelete.games)
    realm.delete(objectToDelete)
}
// …
Run Code Online (Sandbox Code Playgroud)

注意:将来,Realm会将Cascading Deletes作为功能.一旦发布,您甚至不需要处理相关游戏的手动删除,但您宁愿能够在模型中声明强关系,以便自动删除游戏.

替代链接声明

您也可以反过来声明您的链接,但这将使得将来可能更难使用像Cascading Deletes这样的功能.但是,现在删除它们的代码看起来与上面相同.

 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
 }
Run Code Online (Sandbox Code Playgroud)