Как создать CoreData SUBQUERY с предложением BETWEEN? - PullRequest
1 голос
/ 17 марта 2019

Я пытаюсь получить только те категории, в которых entries.date находится между двумя датами.Мои исследования показали мне, что это возможно через SUBQUERY.Я следовал примеру в этой статье medium.com SUBQUERY - это не так страшно однако, когда я запускаю свой проект, я получаю 'NSInvalidArgumentException', reason: 'Unable to parse the format string "SUBQUERY(entries, $entry, $entry.date BETWEEN {%@, %@})"'

Я загрузил изображение моей модели данных ифрагмент кода моего NSFetchedResultsController, где я создаю свой оператор предиката с SUBQUERY.

Изображение моей модели данных

    // Create Fetch Request
    let fetchRequest: NSFetchRequest<CDCategory> = CDCategory.fetchRequest()

    // Configure Fetch Request
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "entriesCount", ascending: false)]
    fetchRequest.predicate = NSPredicate(format: "SUBQUERY(entries, $entry, $entry.date BETWEEN {%@, %@})", dataController.week.startDate as CVarArg, dataController.week.endDate as CVarArg)

    // Create Fetched Results Controller
    let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: CoreDataStack.instance.context, sectionNameKeyPath: nil, cacheName: nil)

    // Configure Fetched Results Controller
    fetchedResultsController.delegate = self

    return fetchedResultsController

1 Ответ

0 голосов
/ 17 марта 2019

Вам нужно добавить условие в подзапрос: предполагая, что вы хотите включить CDCategory объекты, для которых ЛЮБОЙ из entries имеет дату между вашими двумя указанными датами, вы хотите, чтобы число ваших подзапросов было большеноль:

fetchRequest.predicate = NSPredicate(format: "SUBQUERY(entries, $entry, $entry.date BETWEEN {%@, %@}).@count > 0", dataController.week.startDate as CVarArg, dataController.week.endDate as CVarArg)

И наоборот, если вы хотите выбрать только те, для которых ни одна из дат записей не совпадает, вы хотите, чтобы счетчик был равен нулю:

fetchRequest.predicate = NSPredicate(format: "SUBQUERY(entries, $entry, $entry.date BETWEEN {%@, %@}).@count == 0", dataController.week.startDate as CVarArg, dataController.week.endDate as CVarArg)

Подобные конструкции позволятВы выбираете только те, где ВСЕ записи соответствуют вашим критериям.

...