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

问题描述 投票:3回答:2

我有一个'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
ios swift nspredicate
2个回答
2
投票

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

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

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

[cd]表达式分别用于指定case和diacritic insensitivity。您可以了解有关核心数据操作here的更多信息。

我从文档中获得了一些基本操作符并将它们放在下面:

BEGINSWITH左手表达式以右手表达式开头。

CONTAINS左手表达式包含右手表达式。

ENDSWITH左手表达式以右手表达式结束。

LIKE左手表达式等于右手表达式:?和*被允许作为通配符,在哪里?匹配1个字符,*匹配0个或更多个字符。


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))
© www.soinside.com 2019 - 2024. All rights reserved.