【问题标题】:Core Data NSPredicate For Property of type Array用于数组类型属性的核心数据 NSPredicate
【发布时间】:2015-06-23 10:21:48
【问题描述】:

我有这个核心数据对象

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

【问题讨论】:

标签: ios swift core-data nspredicate nsfetchrequest


【解决方案1】:

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

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

如果YearRange 数组的元素代表一个范围的开始和结束年份,那么我推荐后一个选项,带有两个整数属性:yearRangeStartyearRangeEnd。如果YearRange 可能包含多个离散年份,那么第一个选项可能是最好的。

【讨论】:

    猜你喜欢
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    相关资源
    最近更新 更多