我正在使用王国对象,如下所示,并创建了一个对象的数据库。我还创建了一个函数来根据当前时间找到一个元素。我很难创建这个函数所需要的谓词。我使用的是领域备忘表中定义的格式,但我得到的异常如下所示:
由于异常“无效谓词”而终止应用程序的原因:“运算符之间的谓词必须将KeyPath与聚合进行比较,并具有两个值”
import Foundation
import RealmSwift
func composeUniqueRealmPrimaryKeyForWorkorder(_ start:String) -> String {
return start
}
class WorkorderRecord: Object {
dynamic var id = ""
dynamic var workorder = ""
dynamic var start = "" // defines start time string as in 2017-06-09 9:00
dynamic var end = "" // defines end of interval as in 2017-06-10 16:30
override static func primaryKey() -> String? {
return "id"
}
override class func indexedProperties() -> [String] {
return ["workorder","start","end"]
}
convenience init(_ workorder:String, start:String, end:String) {
self.init()
self.id = composeUniqueRealmPrimaryKeyForWorkorder (workorder)
self.workorder = workorder
self.start = start
self.end = end
}
}
func getValueForInterval(time:String) -> String? {
let realm = try! Realm()
let predicate = NSPredicate(format: "%@ BETWEEN {start , end }", time)
let r = realm.objects(WorkorderRecord.self).filter(predicate)
if r.count == 0 {
print("NO RECORD FOUND")
return ""
} else {
let workorder = r[0].workorder
let start = r[0].start
let end = r[0].end
print("RECORD Retrieved: workorder= \(workorder) start= \(start) end= \(end)")
return workorder
}
}
发布于 2017-05-31 18:59:00
如果您对BETWEEN
操作符提供的语义进行推理,您很快就会意识到,foo BETWEEN {bar, baz}
等同于foo >= bar AND foo <= baz
。虽然领域目前只支持{bar, baz}
聚合表达式中的常量值,但对正常的关系比较运算符没有这样的限制。
您将遇到的一个症结是,虽然领域支持比较运算符,例如数值类型和>=
类型的<=
,但字符串类型目前不支持比较运算符。由于您将开始和结束时间存储为字符串,因此您无法在不进行进一步更改的情况下利用此转换。
如果切换到使用Date
类型存储时间,则可以将查询重新表述为:
let predicate = NSPredicate(format: "%@ >= start AND %@ <= end", time, time)
这样做还可以减少存储日期所需的空间。
:请注意,只有当关键路径foo
不遍历任何到多个关系时,这才是正确的。如果它确实遍历多个关系,则需要一个SUBQUERY
来匹配BETWEEN
的语义。
https://stackoverflow.com/questions/44291912
复制相似问题