Как использовать NSPredicate для фильтрации массива, хранящегося в CoreData? - PullRequest
3 голосов
/ 19 апреля 2019

У меня есть массив '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

Ответы [ 2 ]

2 голосов
/ 20 апреля 2019

Вы не можете этого сделать.Проверьте этот ответ основной массив данных строкового фильтра

Вы можете подумать о том, чтобы иметь объект для тегов, или присоединить массив тегов и иметь его как целую строку в текущей сущности, таким образомимея свойство tags как тип String.Для последнего подхода вы можете искать с помощью предиката ниже.

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

Выражение [cd] должно указывать регистр и нечувствительность соответственно.Вы можете узнать больше об операциях с основными данными здесь .

Я получил некоторые базовые операторы из документации и поместил их ниже:

BEGINSWITH Левое выражение начинается с правого выражения.

СОДЕРЖИТ Левыйвыражение содержит правое выражение.

ENDSWITH Левое выражение заканчивается правым выражением.

LIKE Левое выражение равно правому выражению:?и * разрешены в качестве символов подстановки, где?соответствует 1 символу и * соответствует 0 или более символам.

0 голосов
/ 20 апреля 2019

Вам нужно написать предикат и установить как часть запроса, например, так ...

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