我有这个核心数据对象
class Foo: NSManagedObject {
@NSManaged var YearRange: AnyObject? // [2000,2015]
}
我需要知道2005是否在NSManagedObject属性YearRange的范围内。
这是我的东西:
let request :NSFetchRequest = NSFetchRequest(entityName:"Foo")
let Predicate = NSPredicate(format: "xxx", "xxx")
request.predicate = Predicate
var error: NSError? = nil
var matches: AnyObject = self.managedObjectContext!.executeFetchRequest(request, error: &error)!
if (error == nil && matches.count > 0){
println(matches)
}
什么可以帮助我的NSPredicate格式?
最佳答案
由于CoreData本身不支持数组属性,因此我假设YearRange
定义为可转换。如果真是这样,并且假设您使用的是SQLLite存储,则不能使用基于YearRange
的谓词来过滤提取请求。 (可转换对象作为NSData Blob存储在SQL数据库中,并且仅在加载到内存后才转换回适当的对象类型。对于SQLLite存储,CoreData会将所有谓词编译到访存SQL中并在数据库本身中评估结果。因此谓词不能基于可变形对象。)
您有两种选择:1)您可以获取所有对象,然后在内存中对其进行过滤,或者2)修改模型以将YearRange
存储为CoreData本机类型(即字符串,数字,日期等)。
如果YearRange
数组的元素表示一个范围的开始和结束年份,那么我建议使用后一种方法,该方法具有两个整数属性:yearRangeStart
和yearRangeEnd
。如果YearRange
可能包含数个离散年份,则第一个选项可能是最好的。