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

How to use NSPredicate to filter an array stored in CoreData?

我有一个 'tags' 数组作为数组存储在 CoreData(类型 'Transformable')中。 我正在向 CoreData 发出请求,以根据 searchText(字符串)输入检索标签。

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

let request = NSFetchRequest<NSFetchRequestResult>(entityName: Constants.Trip)

if(searchText != nil && searchText != "") {
    request.predicate = NSPredicate(format: "ANY %@ in tags", searchText!)
}

request.returnsObjectsAsFaults = false

你不能那样做。检查这个答案 core data array of string filter

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

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

[cd]表达式分别指定不区分大小写和变音符号。 您可以进一步了解 Core Data 操作 here

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

开始 左边的表达式从右边的表达式开始。

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

结束 左边的表达式以右边的表达式结尾。

喜欢 左边的表达式等于右边的表达式: ?和 * 允许作为通配符,其中 ?匹配 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))