Swift3 使用BETWEEN查找域中的对象

Swift3 使用BETWEEN查找域中的对象,swift3,realm,Swift3,Realm,我正在使用如下所示的领域对象,并创建了一个对象数据库。我还创建了一个基于当前时间查找元素的函数。我在创建此函数所需的谓词时遇到困难。我使用的是领域备忘单中定义的格式,但我得到一个例外,如下所示: 由于未捕获异常“无效谓词”而终止应用程序,原因: '带BETWEEN运算符的谓词必须将键路径与 用两个值进行聚合' 如果您对BETWEEN操作符提供的语义进行推理,您很快就会意识到foo-BETWEEN{bar,baz}相当于foo>=bar和foo=,来自领域备忘单的BETWEEN谓词如下:[NSPr

我正在使用如下所示的领域对象,并创建了一个对象数据库。我还创建了一个基于当前时间查找元素的函数。我在创建此函数所需的谓词时遇到困难。我使用的是领域备忘单中定义的格式,但我得到一个例外,如下所示:

由于未捕获异常“无效谓词”而终止应用程序,原因: '带BETWEEN运算符的谓词必须将键路径与 用两个值进行聚合'


如果您对
BETWEEN
操作符提供的语义进行推理,您很快就会意识到
foo-BETWEEN{bar,baz}
相当于
foo>=bar和foo=
来自领域备忘单的BETWEEN谓词如下:[NSPredicate-predicateWithFormat:@“费用介于{200,400}]从代码中我可以看到:{start,end}之间的时间(不管值是多少)。我认为“开始”和“结束”应该有真正的价值。我同意你的说法,但我想找到一条介于“开始”和“结束”之间的记录,这是每条记录上的字段。关于如何创建一个合适的谓词,你有什么想法吗?那么你必须像你为《时代》所做的那样为开始和结束提供实际的值。谢谢你的清晰解释和编辑我的问题。现在清楚多了。我现在必须在时间之前找到时间间隔。
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
    }
}
let predicate = NSPredicate(format: "%@ >= start AND %@ <= end", time, time)