swift - 如何重新排序 Realm LinkingObjects 中的元素?

标签 swift realm

我有一个 Item 数据类,每个 Item 都有一个父项和许多子项,它们是来自父属性的 LinkingObjects。 简化版:

@objcMembers class Item: Object {
    dynamic var title: String = ""
    dynamic var parent: Item?
    let children = LinkingObjects(fromType: Item.self, property: "parent")
}

我需要能够对子项重新排序,并保留该更改。似乎因为 LinkingObjects 是一种容器类型,所以这是不可能的?在这种情况下,您会建议我如何处理这个问题——我应该更改 children 吗?正常List<Item>并且每次都以两种方式手动更新 Realm ?有更好的解决方案吗?

最佳答案

The order in which the children appear matters, because users will want to choose their own ordering based on which items they want to see first.

这里的重要部分是您要控制“子项出现的顺序”。如果您能够识别数据“模型”和数据“ View ”之间的区别,那么您就可以找出答案。请记住,Realm 模型表示不在您的控制之下,您也不需要它。它如何存储在 Realm 数据库中不是你的问题。

实际上,当您请求 LinkingObjects 字段的结果时,它可能是数据库查询的结果,而不是直接从表中提取的结果。因此,字段中对象的顺序可能不一致,或者添加更多链接对象可能会导致额外的项目出现在结果中的任何位置。

正如您所说,重要的是 child 出现的顺序。这可以通过查询来控制。 LinkingObjects 类型允许您直接查询,即您可以调用:

item.children.sorted(byKeyPath: "title")

一个建议是为您的模型类型添加一个扩展来为您处理排序,为您需要的每种排序类型提供一个访问器,例如:

extension Item
{
  var childrenSortedByTitle: Results<Item>
  {
    return children.sorted(byKeyPath: "title")
  }
}

或者您可以使用 ascending bool 参数使该函数在查询中使用。或者您可以添加第二个升序/降序查询。您还可以为您希望作为排序依据的每个其他参数添加额外的查询。或者您可以定义排序字段的枚举并将其作为参数传递。无论哪种方法最适合您。但绝对值得将查询详细信息隐藏在类扩展本身(恕我直言)中。

关于swift - 如何重新排序 Realm LinkingObjects 中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57030702/

相关文章:

android - 将 Kotlin ByteArray 保存到 Realm 中

swift - 如何在模块中引用类型与所在模块同名的类型?

ios - 找不到类型 "UITableViewRowAction"的初始值设定项

ios - 在最初被拒绝后,我如何获得隐私权限以重新出现?

react-native - 无法在 'send' : Failed to load 'htpp://localhost:8083/上执行 'XMLHttpRequest'

ios - 后退按钮和创建新条目导致应用程序崩溃(无法修改 UUID)Realm Swift

java - 在同一个 RealmObject Android 上使用两个不同的 asyncTask 时消耗过多的内部内存

ios - 从 Realm 查询中排除对象 - 尝试按相关性排序(Swift)

ios - Swift:闭包、完成处理程序和函数之间的区别?

ios - 如何使用 Swift 从 UIBezierPath 创建虚线 SKShapeNode?