我正在尝试使用带有资源库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。但后来我发现它不是,谓词可以逃脱'?'自动在一些示例代码中。
然后我尝试删除核心数据存储文件,一切正常,所以我认为问题是由数据模型的不一致引起的
答案 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)