如何重新排序 Realm LinkingObjects 中的元素?
How can I reorder elements in Realm LinkingObjects?
我有一个 Item 数据 class,每个 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>
并且每次都以两种方式手动更新领域?有更好的解决方案吗?
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.
这里的重要部分是你想要控制'order in which the children appear'。如果您可以识别数据的 'model' 和数据的 'view' 之间的差异,那么您就可以得出答案。请记住,Realm 模型表示不在您的控制之下,您也不需要它。它如何存储在 Realm 数据库中不是你的问题。
实际上,当您请求 LinkingObjects
字段时,它的结果可能是数据库查询的结果,而不是直接从 table 中提取的结果。因此 objects 在字段中的顺序可能不一致,或者添加进一步链接 objects 可能会导致额外的项目出现在结果中的任何地方。
正如您所说,重要的是 children 出现的顺序 。这可以通过查询来控制。 LinkingObjects
类型允许您直接查询,即您可以调用:
item.children.sorted(byKeyPath: "title")
一个建议是为您的模型类型添加一个扩展来为您处理排序,为您需要的每种排序类型提供一个访问器,例如:
extension Item
{
var childrenSortedByTitle: Results<Item>
{
return children.sorted(byKeyPath: "title")
}
}
或者您可以使该函数具有 ascending
布尔参数以在查询中使用。或者您可以为 ascending/descending 添加第二个查询。您还可以为您希望作为排序依据的每个其他参数添加额外的查询。或者您可以定义排序字段的枚举并将其作为参数传递。无论哪种方法最适合您。但绝对值得将查询详细信息隐藏在 class 扩展本身(恕我直言)中。
我有一个 Item 数据 class,每个 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>
并且每次都以两种方式手动更新领域?有更好的解决方案吗?
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.
这里的重要部分是你想要控制'order in which the children appear'。如果您可以识别数据的 'model' 和数据的 'view' 之间的差异,那么您就可以得出答案。请记住,Realm 模型表示不在您的控制之下,您也不需要它。它如何存储在 Realm 数据库中不是你的问题。
实际上,当您请求 LinkingObjects
字段时,它的结果可能是数据库查询的结果,而不是直接从 table 中提取的结果。因此 objects 在字段中的顺序可能不一致,或者添加进一步链接 objects 可能会导致额外的项目出现在结果中的任何地方。
正如您所说,重要的是 children 出现的顺序 。这可以通过查询来控制。 LinkingObjects
类型允许您直接查询,即您可以调用:
item.children.sorted(byKeyPath: "title")
一个建议是为您的模型类型添加一个扩展来为您处理排序,为您需要的每种排序类型提供一个访问器,例如:
extension Item
{
var childrenSortedByTitle: Results<Item>
{
return children.sorted(byKeyPath: "title")
}
}
或者您可以使该函数具有 ascending
布尔参数以在查询中使用。或者您可以为 ascending/descending 添加第二个查询。您还可以为您希望作为排序依据的每个其他参数添加额外的查询。或者您可以定义排序字段的枚举并将其作为参数传递。无论哪种方法最适合您。但绝对值得将查询详细信息隐藏在 class 扩展本身(恕我直言)中。