RealmSwift 查询中带有内部对象引用的谓词问题
Problem with predicates with inner object references in RealmSwift query
我有一份报告 class 例如:
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 class 的评估变量。
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")
每当我尝试获取已保存的报告时,我都会崩溃。
"terminating with uncaught exception of type NSException".
我想不通。
发生错误可能是因为您的类型与 Realm 期望的类型不同。
assessment.cycle
和 assessment.year
是整数,因此您不应使用 %@
作为它们的占位符。 %@
用于字符串。您应该对整数使用 %i
。
您还应该删除参数中的字符串转换。
let predicate = NSPredicate(format: "studentProfileId = %@ AND assessment.year = %i AND assessment.cycle >= %i",
report.studentProfileId!,
report.assessment?.year.value!,
report.assessment?.cycle!
)
你也可以这样做。
let predicate = NSPredicate(format: "studentProfileId = %@ AND assessment.year = \(report.assessment?.year.value!) AND assessment.cycle >= \(report.assessment?.cycle!)", report.studentProfileId!)
我有一份报告 class 例如:
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 class 的评估变量。
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")
每当我尝试获取已保存的报告时,我都会崩溃。
"terminating with uncaught exception of type NSException".
我想不通。
发生错误可能是因为您的类型与 Realm 期望的类型不同。
assessment.cycle
和 assessment.year
是整数,因此您不应使用 %@
作为它们的占位符。 %@
用于字符串。您应该对整数使用 %i
。
您还应该删除参数中的字符串转换。
let predicate = NSPredicate(format: "studentProfileId = %@ AND assessment.year = %i AND assessment.cycle >= %i",
report.studentProfileId!,
report.assessment?.year.value!,
report.assessment?.cycle!
)
你也可以这样做。
let predicate = NSPredicate(format: "studentProfileId = %@ AND assessment.year = \(report.assessment?.year.value!) AND assessment.cycle >= \(report.assessment?.cycle!)", report.studentProfileId!)