如何摆脱问号'?'在Core Data谓词中

时间:2014-12-27 09:00:38

标签: ios core-data swift

我正在尝试使用带有资源库url的谓词来获取核心数据对象:

let predicate = NSPredicate(format: "url == %@", imageURL)

其中imageURL是一个字符串,如:assets-library://asset/asset.JPG?id=6E5438ED-9A8C-4ED0-9DEA-AB2D8F8A9360&ext=JPG

在运行时,我总是得到一个例外。但是,如果我从url字符串中删除问号,一切正常。

然后我发现:“问号(?)字符不是有效的解析器令牌。”在Apple's documentation

如果我真的需要使用'?',有什么我可以做的吗?作为我的谓词字符串的一部分?

更新

起初我认为我的问题与问号有关,因为如果我删除'?',应用就可以工作了来自imageURL。但后来我发现它不是,谓词可以逃脱'?'自动在一些示例代码中。

然后我尝试删除核心数据存储文件,一切正常,所以我认为问题是由数据模型的不一致引起的

3 个答案:

答案 0 :(得分:2)

您需要确保该对象是一个字符串。如果?正确包装在字符串对象中,它应该有效。

如果它真的是一个字符串,你可以构造谓词并过滤NSArray而不会出现问题。以下按预期工作。 (为简单起见,我使用self和一个简单的数组而不是具有url属性的NSManagedObjects数组,但机制是相同的。)

let url = "assets-library://asset/asset.JPG?id=6E5438ED"
let predicate = NSPredicate(format: "self = %@", url)!
let array = [ "assets-library://asset/asset.JPG?id=6E5438ED", 
              "assets-library://asset/asset.JPG?id=48765" ] as NSArray
let filtered = array.filteredArrayUsingPredicate(predicate)

但是,如果您有一个NSURL对象,则必须确保获得正确的字符串表示。用以下内容替换上面的第一行:

let url = NSURL(string: "assets-library://asset/asset.JPG?id=6E5438ED")!

您需要确保将正确的字符串传递给谓词。

let predicate = NSPredicate(format: "self = %@", url.description)!

以上也按预期工作。

答案 1 :(得分:-1)

尝试添加引号:

(format: "url == '%@'", imageURL)

答案 2 :(得分:-2)

使用like运算符而不是==。理论上,这将匹配所有字符串,用一个字符代替?,但我怀疑你会得到误报:

let predicate = NSPredicate(format: "url like %@", imageURL)