2014-07-20 27 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对象。