2014-07-20 28 views
17

我有一個核心數據對象和我有2個Fieds(一個字符串(GUID)和一個詮釋,我想作爲過濾器使用)NSPredicate用斯威夫特和核心數據

所以在SQL這將是「SELECT *從答案WHERE qIndex = 1 AND GUID =「88bfd206-82fb-4dd0-B65D-096f8902855c」

我用盡它與核心數據,但我不能與字符串值進行過濾。

這裏是我的代碼

var request = NSFetchRequest(entityName: "Answers") 
    request.returnsObjectsAsFaults = false; 

    let resultPredicate1 = NSPredicate(format: "qIndex = %i", qIndex) 
    let resultPredicate2 = NSPredicate(format: "formUUID = %s", formUUID) 

    var compound = NSCompoundPredicate.andPredicateWithSubpredicates([resultPredicate1, resultPredicate2]) 
    request.predicate = compound 


    var results:NSArray = context.executeFetchRequest(request, error: nil) 

任何想法我在做什麼錯誤?使用相同的代碼和2個整數值篩選它工作正常。

由於提前

+1

您使用了字符串格式說明符%i。我認爲它應該是一個十進制的%d或一個NSNumber的%@。不是%i,不存在int,不存在 – Obenland

+1

@Xean:可以使用「%d」和「%i」格式化一個int,它們是相同的。 –

+0

爲什麼結果不是空的時候沒有任何匹配?我得到[(entity:Charts; id:0xd000000000040000 ; data:)] –

回答

40

如果formUUIDNSString或斯威夫特String,那麼你必須使用 %@佔位符:

let resultPredicate2 = NSPredicate(format: "formUUID = %@", formUUID) 
+1

注意編輯建議:在謂詞字符串中可以使用'='和'=='。 –

8

這不是你的問題的確切迴應,但有問題現在人們可能會使用你的代碼:

在最新版本的XCode中,你現在必須打開謂詞,如下所示:

var compound = NSCompoundPredicate.andPredicateWithSubpredicates([predicate1!, predicate2!]) 

因爲NSPredicate初始值設定項現在返回NSPredicate?類型。

+1

正如你自己所說,這不是一個真正的答案,而是一個說明。出於這個原因,你應該添加這個作爲評論,而不是一個答案。 – JohannesB

+6

是的,沒錯。但是我已經在stackOverflow上註冊了幾周,並且我的名聲(1)不允許我評論其他人的問題/答案;) – DarksteelPenguin

1

而是擔心%@轉換,然後撰寫AND謂詞,您可以使用PredicatePal框架:

let compound = *(Key("qIndex") == qIndex && Key("formUUID") == formUUID) 

假設qIndexformUUID是正確的類型,SWIFT將自動推斷正確的類型爲Key對象。