草庐IT

swift - 删除一对多关系

coder 2023-09-08 原文

我有一个一对多的关系:

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)
}
// …

模型推荐

我建议您为模型添加显式链接,而不是通过松散链接的外键来表达关系。但是对象映射是非常个人化的,可能取决于超出您的问题和此答案范围的进一步限制。如需进一步引用,如下所示:

 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 将带来级联删除功能。一旦发布,您甚至不需要手动删除相关游戏,而是能够在您的模型中声明强关系,以便自动删除游戏。

替代链接声明

您也可以声明您的链接反之亦然,但这会使将来使用像级联删除这样的功能变得更加困难。但是,现在删除它们的代码看起来与上面相同。

 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 - 删除一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32341738/

有关swift - 删除一对多关系的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  3. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  4. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

  5. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

    我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

  6. ruby-on-rails - 标准化文件名的字符串,删除重音和特殊字符 - 2

    我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin

  7. [工业相机] 分辨率、精度和公差之间的关系 - 2

    📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

  8. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

  9. ruby - 如果它是标点符号,我怎么能从字符串中删除最后一个字符,在 ruby​​ 中? - 2

    啊,正则表达式有点困惑。我正在尝试删除字符串末尾所有可能的标点符号:ifstr[str.length-1]=='?'||str[str.length-1]=='.'||str[str.length-1]=='!'orstr[str.length-1]==','||str[str.length-1]==';'str.chomp!end我相信有更好的方法来做到这一点。有什么指点吗? 最佳答案 str.sub!(/[?.!,;]?$/,'')[?.!,;]-字符类。匹配这5个字符中的任何一个(注意,。在字符类中并不特殊)?-前一个字符或组

  10. 键删除后 ruby​​ 哈希内存泄漏 - 2

    你好,我无法成功如何在散列中删除key后释放内存。当我从哈希中删除键时,内存不会释放,也不会在手动调用GC.start后释放。当从Hash中删除键并且这些对象在某处泄漏时,这是预期的行为还是GC不释放内存?如何在Ruby中删除Hash中的键并在内存中取消分配它?例子:irb(main):001:0>`ps-orss=-p#{Process.pid}`.to_i=>4748irb(main):002:0>a={}=>{}irb(main):003:0>1000000.times{|i|a[i]="test#{i}"}=>1000000irb(main):004:0>`ps-orss=-p

随机推荐