核心数据NSPredicate类型为Array的属性

时间:2015-06-23 10:21:48

标签: ios swift core-data nspredicate nsfetchrequest

我有这个核心数据对象

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格式?

1 个答案:

答案 0 :(得分:4)

由于CoreData本身不支持数组属性,我认为YearRange被定义为 Transformable 。如果是这种情况,并假设您使用的是SQLLite存储,则不能使用基于YearRange的谓词来过滤获取请求。 (转换器作为NSData blob存储在SQL数据库中,并且在加载到内存时仅转换回适当的对象类型。对于SQLLite存储,CoreData将任何谓词编译到fetch SQL中并在数据库本身中评估结果。谓词不能基于Transformables。)

您有两个选择:1)您可以获取所有对象,然后在内存中过滤它们,或者2)修改模型以将YearRange存储为CoreData本机类型(即字符串,数字,日期)等)。

如果YearRange数组的元素表示范围的起始年份和结束年份,那么我建议使用后两个选项,其中包含两个整数属性:yearRangeStartyearRangeEnd。如果YearRange可能包含多个离散年份,则第一个选项可能是最佳选择。