【问题标题】:Realm results sort by callback领域结果按回调排序
【发布时间】:2016-11-07 14:09:29
【问题描述】:

我有一个“importData”函数,它从 API 中获取一堆 JSON 并将其填充到领域数据库中。该json的一部分看起来像:

files: [
  300,
  19,
  102
]

这些数字与我在获取这些之前已经处理/导入的 JSON 的顺序部分相关,基本上只是属于该组的文件列表。

这在我的领域对象中是这样建模的:

class SomeGroup : Object {
    let files = List<File>()
}

我需要保留这些 id 的排序顺序,以便当我链接文件关系时,文件的顺序正确。

为了获取我需要链接的文件模型,我运行如下查询:

let thefiles = realm.objects(File.self).filter("id IN %@", fileIds)

问题是这会以不同的顺序返回它们,.sorted 方法只能按模型属性排序(从我可以从文档中得知)。

我考虑循环遍历结果并将它们从 Result&lt;File&gt; 类型转换为基本 Array&lt;File&gt;List&lt;File&gt; 类型,以便我可以自己对它们进行排序,但是这会丢失领域指针信息,因此我希望领域无法创建链接。

唯一的另一件事是查询每个文件并将其单独附加到组文件关系中,但是如果我这样做,查询计数将会飙升。

有人可以告诉我通过自定义函数/回调订购 Result&lt;File&gt; 类型的最佳方法,以便它与我的 json 中的 id 数组匹配吗?

【问题讨论】:

  • 如果文件添加到集合的顺序与您的模型和工作流程相关,那么您应该向模型添加一个“顺序”键(File 对象)。您在迭代 JSON 输入并创建 File 对象时设置它,稍后在查询中使用它以获得正确的顺序。
  • @bogdanf 这是一个多对多的关系。要设置顺序键,我必须在关系上放置顺序(类似于 mysql 中数据透视表上的额外列)。
  • 是的,正确,为什么不创建一个“关系”对象,其中包含指向组和文件的链接以及文件的顺序?
  • @bogdanf 当然,我可以创建一个枢轴对象,但我正在尝试找出是否有更优雅的解决方案,因为领域列表保持其顺序,唯一导致问题的是订购插入列表,其他所有内容都已支持。找到一个可行的解决方案相对简单,我发布问题的原因是确定是否有一种方法可以在不重新建模我的数据的情况下做到这一点

标签: swift sorting realm


【解决方案1】:

在 Realm 中维护一组对象的顺序的最佳做法是将它们简单地存储在 List 对象中。如果您可以调整您的逻辑以访问SomeGroup 中的files 属性,那似乎是最好的方法。

除此之外,您可能会考虑创建一个全新的 Realm Object 模型,其作用是简单地管理有序的文件列表。

class FileList : Object {
    let files = List<File>()
}

【讨论】:

  • 你的建议正是我开始的,并利用了列表保持其排序顺序的事实。问题是列表是从一个领域结果查询中创建的,该查询的顺序错误。因为关系是多对多的,所以我不能将顺序存储为文件对象上的整数(文件位于不同的位置,具体取决于它所显示的组)。我希望能够使用自定义排序功能对列表进行排序,但是排序领域结果对象不允许这样做。我最终选择了一个中间枢轴对象,因为我无法解决
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多