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

3

我在 CoreData 中存储了一个名为“tags”的数组(类型为“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
2个回答

2
你不能这样做。请查看此答案core data array of string filter 你可以考虑为标签创建一个实体,或者将标签数组连接起来作为当前实体的整个字符串,因此将标签属性设置为String类型。对于最后一种方法,您可以使用以下谓词进行搜索。
 NSPredicate(format: "tags CONTAINS[cd] %@", searchText)

[cd] 表达式分别用于指定忽略大小写和重音符号。您可以在这里了解更多有关核心数据操作的信息。
我从文档中获取了一些基本运算符,并将它们列在下面:
BEGINSWITH 左侧表达式以右侧表达式开头。
CONTAINS 左侧表达式包含右侧表达式。
ENDSWITH 左侧表达式以右侧表达式结尾。
LIKE 左侧表达式等于右侧表达式:? 和 * 分别用作通配符,其中 ? 匹配 1 个字符,* 匹配 0 个或多个字符。

我之前尝试过这个,当执行获取请求时,一直会出现“EXC_BAD_ACCESS”错误。(没有谓词的情况下,获取操作运行良好)。我已经三次检查了实体名称和属性名称,所以不确定为什么会发生这种情况... - Rachel
1
现在我明白了你的问题。我更新了答案,希望能有所帮助。 - Mateus Forgiarini da Silva
1
非常感谢您澄清这个问题!我都快疯了。 - Rachel

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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接