Ios 核心数据谓词SQL无法分析

Ios 核心数据谓词SQL无法分析,ios,sql,swift,core-data,Ios,Sql,Swift,Core Data,我一直在绞尽脑汁让我的过滤语句发挥作用。我已经尝试了很多方法(正如您在我的注释代码中看到的)。我试图做的是在用户键入时进行搜索-搜索customerObject.firstName、customerObject.lastName和标题-如果其中有短语,则显示这些结果。lastName和.firstName是customerObject的属性 class func searchContainsPredicateEstimateInvoice(searchString: String, existi

我一直在绞尽脑汁让我的过滤语句发挥作用。我已经尝试了很多方法(正如您在我的注释代码中看到的)。我试图做的是在用户键入时进行搜索-搜索customerObject.firstName、customerObject.lastName和标题-如果其中有短语,则显示这些结果。lastName和.firstName是customerObject的属性

class func searchContainsPredicateEstimateInvoice(searchString: String, existingPredicate: NSPredicate? = nil) -> NSPredicate
    {
        var words = searchString.componentsSeparatedByString(" ")
        var predicateList = [NSPredicate]()
        for word in words
        {
            if count(word) > 0
            {
                var str = NSString(format: "SUBQUERY(%@, $f, $f.%@ CONTAINS[cd] %@) OR SUBQUERY(%@, $l, $l.%@ CONTAINS[cd] %@) OR (%@ CONTAINS[cd] %@)", "\(CUSTOMER_OBJECT_KEY)","\(USER_FIRST_NAME_LOCAL_KEY)" ,word, "\(CUSTOMER_OBJECT_KEY)", "\(USER_LAST_NAME_LOCAL_KEY)", word, ESTIMATE_NAME_KEY, word)
                println(str)
                var pred = NSPredicate(format: "SUBQUERY(%@, $f, $f.%@ CONTAINS[cd] %@) OR SUBQUERY(%@, $l, $l.%@ CONTAINS[cd] %@) OR (%@ CONTAINS[cd] %@)", "\(CUSTOMER_OBJECT_KEY)","\(USER_FIRST_NAME_LOCAL_KEY)" ,word, "\(CUSTOMER_OBJECT_KEY)", "\(USER_LAST_NAME_LOCAL_KEY)", word, ESTIMATE_NAME_KEY, word)

                //var pred = NSPredicate(format: "SUBQUERY(customerObject, $f, $f.firstName CONTAINS[cd] W).@count > 0")
                //var pred = NSPredicate(format: "SUBQUERY(customerObject, $g, $g.firstName CONTAINS[cd] %@).@count > 0", word)
                //var str = NSString(format: "SUBQUERY(%@, $f, $f.%@ CONTAINS[cd] %@) OR SUBQUERY(%@, $l, $l.%@ CONTAINS[cd] %@) OR (%@ CONTAINS[cd] %@)", "\(CUSTOMER_OBJECT_KEY)","\(USER_FIRST_NAME_LOCAL_KEY)" ,word, "\(CUSTOMER_OBJECT_KEY)", "\(USER_LAST_NAME_LOCAL_KEY)", word, ESTIMATE_NAME_KEY, word)
                predicateList.append(pred)
            }
        }

        if existingPredicate != nil
        {
            predicateList.append(existingPredicate!)
        }

        return NSCompoundPredicate(type: .AndPredicateType, subpredicates: predicateList)

    }
    //var pred = NSPredicate(format: "SUBQUERY(%K, $f, $f.%K CONTAINS[cd] %@) OR SUBQUERY(%K, $l, $l.%K CONTAINS[cd] %@) OR (%K CONTAINS[cd] %@)", "\(CUSTOMER_OBJECT_KEY)","\(USER_FIRST_NAME_LOCAL_KEY)" ,word, "\(CUSTOMER_OBJECT_KEY)", "\(USER_LAST_NAME_LOCAL_KEY)", word, ESTIMATE_NAME_KEY, word)
这是日志上显示内容的实际值:

SUBQUERY(customerObject, $f, $f.firstName CONTAINS[cd] W) OR SUBQUERY(customerObject, $l, $l.lastName CONTAINS[cd] W) OR (name CONTAINS[cd] W)
数据模型:
谓词创建中存在一些问题:

  • 子查询仅与对多个关系(甚至 然后不总是需要)
  • 切勿使用
    NSString(格式:)
    创建谓词。逃逸 字符串格式字符串和谓词格式字符串之间的引用规则 他们太不一样了
  • 使用
    %K
    替换密钥路径,而不是
    %@
因此,谓词应该类似于

let pred = NSPredicate(format: "%K.%K CONTAINS[c] %@ OR %K.%K CONTAINS[c] %@",
    CUSTOMER_OBJECT_KEY, USER_FIRST_NAME_LOCAL_KEY, word,
    CUSTOMER_OBJECT_KEY, USER_LAST_NAME_LOCAL_KEY, word)
假设CUSTOMER\u OBJECT\u KEY是一对一关系的名称, 和USER\u FIRST\u NAME\u LOCAL\u KEY/USER\u LAST\u NAME\u LOCAL\u KEY是属性
目标实体的关系。

您的实体中是否存在“customerObject”关系?对一个人还是对许多人?核心数据模型的屏幕截图可能很有用。没有意识到关系对查询很重要。因此,是的-customerObject是一个不同的核心数据实体,估计值引用它。这就做到了:
let pred=NSPredicate(格式:“%K.%K包含[c]@或%K.%K包含[c]@或%K包含[c]@”,CUSTOMER\u OBJECT\u KEY,USER\u LAST\u NAME\u LOCAL\u KEY,word,CUSTOMER\u OBJECT\u KEY,USER\u FIRST\u NAME\u LOCAL\u KEY,word,估计值\u NAME\u KEY,word)