【问题标题】:Swift Realm filter on relationship object关系对象上的 Swift Realm 过滤器
【发布时间】:2023-04-01 18:02:01
【问题描述】:

我正在尝试通过以下方式对 Realm 对象列表执行过滤器。

我有两个对象类别和公司

class Category: Object {
    dynamic var name = ""
    dynamic var isActive = true
    let companies = List<Company>() 
}

class Company: Object {
    dynamic var name = ""
}

类别从一个控制器发送到另一个控制器,以便显示该类别中的所有公司

var category: Category!
var rlmCompanies: List<Company>?

到目前为止一切顺利,我可以从中显示公司列表。但是,我正在尝试在控制器顶部添加一个切换栏,以便我进一步过滤显示的公司列表(按它们是否处于活动状态)。

我正在尝试的代码是我尝试过的以下事情之一

rlmCompanies = category.companies.filter("ANY isActive == true")
rlmCompanies = category.companies.filter("ANY companies.isActive == true")
rlmCompanies = category.companies.filter("companies.isActive == true")
rlmCompanies = rlmCompanies.filter("ANY companies.isActive == true")
rlmCompanies = self.rlmCompanies.filter("ANY companies.isActive == true")

所有这些尝试都给出了类似的错误,如下所示:

No filter candidates produce the expected contextual result type List<Company>

因此,我的想法已经不多了。我可以看到这与 List 的初始化方式有关,但看不到如何处理它

【问题讨论】:

  • rlmCompanies 是您分配给控制器类的属性吗?
  • rlmCompanies 是控制器类中的一个变量

标签: swift2 realm


【解决方案1】:

您看到的错误是因为您试图将List.filter 返回的Results&lt;T&gt; 分配给List&lt;T&gt; 类型的变量。您的 rlmCompanies 实例变量应该是 Results&lt;Company&gt; 类型。

【讨论】:

  • 明白。那么,如果它是 Object 中标识的 1:Many 的一部分,我该如何声明 Results 类型的变量。如果我使用 var rlmCompanies: Results? 进行初始化,然后使用 category.companies 对其进行分配,我还会收到一条错误消息,指出无法将类型列表分配给结果。如果它是对象中定义的 1:M 列表的一部分,我如何初始化和设置变量以使用结果?
  • 澄清一下,您是否有时希望过滤 rlmCompanies 而有时不过滤?如果是这样,您可以使用谓词TRUEPREDICATE 进行过滤,以获取内容与未过滤的List&lt;T&gt; 匹配的Results&lt;T&gt;
  • 是的,这就是我所追求的。好的,谢谢,我会研究谓词。如果你有一些很棒的示例代码
【解决方案2】:

最后我通过以下方式更改了代码

我将初始化程序更改为 Results 对象

var rlmCompanies: Results<Company>?

然后,当我创建初始列表时,我添加了一个返回全部的过滤器,因此返回一个结果而不是一个列表

rlmCompanies = category.companies.filter("id <> 'somethingbogus' ")

我最好有类似 ANY 之类的东西,而不是 id 不是伪造的,但找不到它的语法

【讨论】:

  • TRUEPREDICATE 是一个匹配每个对象的谓词。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
  • 1970-01-01
相关资源
最近更新 更多