2015-04-29 32 views
1

我一直在敲我的腦袋,讓我的過濾語句正常工作。我嘗試了一堆東西(正如你在我的評論代碼中看到的那樣)。我試圖做的是在用戶輸入時進行搜索 - 搜索customerObject.firstName,customerObject.lastName和標題 - 如果短語在其中任何一箇中顯示這些結果。 .lastName和.firstName是customerObject的屬性。核心數據謂詞SQL無法解析

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)[email protected] > 0") 
       //var pred = NSPredicate(format: "SUBQUERY(customerObject, $g, $g.firstName CONTAINS[cd] %@)[email protected] > 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) 

數據模型: enter image description here

+0

「customerObject」是否是您實體中的關係?一對一還是多對一?核心數據模型的屏幕截圖可能很有用。 –

+0

沒有意識到查詢的關係。所以是的 - customerObject是一個不同的核心數據實體,一個估計有一個引用。 – Spentak

回答

1

,我們在您謂語創作一些問題:

  • SUBQUERY僅用於與多對多關係(甚至是 然後不總是需要)。
  • 從不使用NSString(format:)來創建謂詞。字符串格式字符串和謂詞格式字符串 之間的轉義和引用規則太不同了。
  • 使用%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_OBJECT_KEY是對一的關係, 和USER_FIRST_NAME_LOCAL_KEY/USER_LAST_NAME_LOCAL_KEY的名稱是屬性的目標實體的 。

+0

這樣做:'''let pred = NSPredicate(format:「%K.%K CONTAINS [c]%@ OR%K.%K CONTAINS [c]%@ OR%K CONTAINS [c]%@ ,CUSTOMER_OBJECT_KEY,USER_LAST_NAME_LOCAL_KEY,單詞,CUSTOMER_OBJECT_KEY,USER_FIRST_NAME_LOCAL_KEY,單詞,ESTIMATE_NAME_KEY,單詞)''' – Spentak