RealmSwift查询中带有内部对象引用的谓词问题

时间:2019-02-06 05:35:45

标签: ios realm swift4

我有一个Report类,例如:

class Report: Object{

   @objc dynamic var id : String? = nil
   @objc dynamic var studentProfileId : String? = nil
   @objc dynamic var createdAt : String? = nil
   @objc dynamic var updatedAt : String? = nil
   @objc dynamic var type : String? = nil
   @objc dynamic var status : String? = nil
   @objc dynamic var assessment : AssessmentLocal? = nil
   var avgScore = RealmOptional<Double>(0)
}

报表类具有评估本地类的评估变量。

class AssessmentLocal: Object{

   @objc dynamic var id : String?
   @objc dynamic var status : String?
   @objc dynamic var type : String?
   @objc dynamic var code : String?
   @objc dynamic var cycle = 0
   var year = RealmOptional<Int>(0)
   @objc dynamic var startDate : String?
   @objc dynamic var grade : String?
}

我正在尝试使用以下谓词进行查询:

let predicate = NSPredicate(format: "studentProfileId = %@ AND assessment.year = %@ AND assessment.cycle >= %@", report.studentProfileId!, String((report.assessment?.year.value)!), String((report.assessment?.cycle)!))

let reports = getDatabase().objects(Report.self).filter(predicate).sorted(byKeyPath: "assessment.cycle")

每当我试图获取保存的报告时,我就会崩溃。

  

“以未捕获的NSException类型的异常终止”。

我无法弄清楚。

2 个答案:

答案 0 :(得分:1)

发生此错误的原因可能是因为您使用的类型与Realm期望的类型不同。

assessment.cycleassessment.year是整数,因此不应将%@用作其占位符。 %@用于字符串。您应该将%i用作整数。

您还应该在参数中删除对字符串的转换。

let predicate = NSPredicate(format: "studentProfileId = %@ AND assessment.year = %i AND assessment.cycle >= %i", 
                            report.studentProfileId!, 
                            report.assessment?.year.value!, 
                            report.assessment?.cycle!
                            )

答案 1 :(得分:0)

您也可以这样。

let predicate = NSPredicate(format: "studentProfileId = %@ AND assessment.year = \(report.assessment?.year.value!) AND assessment.cycle >= \(report.assessment?.cycle!)", report.studentProfileId!)
相关问题