首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在一个领域中找到一个对象

在一个领域中找到一个对象
EN

Stack Overflow用户
提问于 2017-05-31 18:10:19
回答 1查看 1.6K关注 0票数 2

我正在使用王国对象,如下所示,并创建了一个对象的数据库。我还创建了一个函数来根据当前时间找到一个元素。我很难创建这个函数所需要的谓词。我使用的是领域备忘表中定义的格式,但我得到的异常如下所示:

由于异常“无效谓词”而终止应用程序的原因:“运算符之间的谓词必须将KeyPath与聚合进行比较,并具有两个值”

代码语言:javascript
运行
复制
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
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-31 18:59:00

如果您对BETWEEN操作符提供的语义进行推理,您很快就会意识到,foo BETWEEN {bar, baz}等同于foo >= bar AND foo <= baz。虽然领域目前只支持{bar, baz}聚合表达式中的常量值,但对正常的关系比较运算符没有这样的限制。

您将遇到的一个症结是,虽然领域支持比较运算符,例如数值类型和>=类型的<=,但字符串类型目前不支持比较运算符。由于您将开始和结束时间存储为字符串,因此您无法在不进行进一步更改的情况下利用此转换。

如果切换到使用Date类型存储时间,则可以将查询重新表述为:

代码语言:javascript
运行
复制
let predicate = NSPredicate(format: "%@ >= start AND %@ <= end", time, time)

这样做还可以减少存储日期所需的空间。

:请注意,只有当关键路径foo不遍历任何到多个关系时,这才是正确的。如果它确实遍历多个关系,则需要一个SUBQUERY来匹配BETWEEN的语义。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44291912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档