如何使用NSPredicate过滤存储在CoreData中的数组?

时间:2019-04-19 20:24:16

标签: ios swift nspredicate

我在CoreData中存储了一个“标签”数组(类型为“ Transformable”)作为数组。 我正在向CoreData提出请求,以基于searchText(字符串)输入来检索标签。

如何使用NSPredicate根据searchText过滤标签数组?

a = [i for i in range(1,10)]
a2 = filter(lambda x: x % 2 != 0, a)
a3 = map(lambda x: x**2, a2)        # This is a generator object
final_list = list(a3)               # This is a list

2 个答案:

答案 0 :(得分:2)

您不能那样做。检查此答案core data array of string filter

您可能会考虑为标签创建一个实体,或加入标签数组并将其作为整个字符串包含在当前实体中,从而将标签属性设为String类型。对于最后一种方法,您可以使用以下谓词进行搜索。

 NSPredicate(format: "tags CONTAINS[cd] %@", searchText)

[cd]表达式分别指定大小写和变音符号不敏感。 您可以了解有关核心数据操作here的更多信息。

我从文档中得到了一些基本的运算符,并将它们放在下面:

开始 左侧的表达式以右侧的表达式开头。

包含 左侧的表达式包含右侧的表达式。

ENDSWITH 左侧的表达式以右侧的表达式结尾。

喜欢 左手表达式等于右手表达式:?和*允许用作通配符,其中?匹配1个字符,*匹配0个或更多字符。

答案 1 :(得分:0)

您需要编写谓词并将其设置为这样的请求的一部分...

func getEntitiesWithName(_ entityName:String, sortKey:String?, predicate: NSPredicate?, ascending:Bool, context:NSManagedObjectContext) -> [NSManagedObject] {

    var results:[NSManagedObject] = [NSManagedObject]()

    context.performAndWait { () -> Void in

        let request = NSFetchRequest<NSFetchRequestResult>()
        request.entity = NSEntityDescription.entity(forEntityName: entityName, in: context)

        if let fetchPredicate = predicate {
            request.predicate = fetchPredicate
        }

        if let key = sortKey {

            let sortDescriptor = NSSortDescriptor(key: key, ascending: ascending, selector: #selector(NSString.localizedCaseInsensitiveCompare(_:)))
            request.sortDescriptors = [sortDescriptor];
        }

        results = (try! context.fetch(request)) as! [NSManagedObject]
    }

    return results
}

您可以这样设置谓词

let predicate = NSPredicate(format: "isActive == %@", NSNumber(value: true as Bool))