如何对 Realm LinkingObject 中的元素重新排序?



我有一个 Item 数据类,每个 Item 都有一个父项和许多子项,它们是父属性中的链接对象。 简化版本:

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

我需要能够重新排序孩子,并坚持这种变化。似乎因为链接对象是一种容器类型,这是不可能的?在这种情况下,您建议我如何处理 - 我是否应该将children更改为普通List<Item>并且每次都手动更新领域两种方式?有没有更好的解决方案?

子项的显示顺序很重要,因为用户希望根据他们希望首先查看的项目来选择自己的顺序。

这里重要的部分是你想要控制"孩子出现的顺序"。如果你能认识到数据的"模型"和数据"视图"之间的区别,那么你就可以找出答案。请记住,Realm 模型表示不在您的控制之下,您也不需要它。它在 Realm 数据库中的存储方式不是您的问题。

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

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

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

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

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

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

最新更新