countForFetchRequest и executeFetchRequest возвращают различное количество результатов - PullRequest
3 голосов
/ 26 октября 2010

Я обнаружил, что NSFetchRequest возвращает разные результаты для подсчета и выполнения.

У меня есть объект Product и объект Size. Продукт имеет много размеров.

У меня есть два продукта, productA и productB. Продукт A доступен только в размере 1, а продукт В доступен как в размере 1, так и в размере 2.

С учетом NSP предиката

ANY sizes.#size IN {"size1", "size2"}

Я обнаружил, что он возвращает 3 для countForfetchRequest, но массив из 2 элементов, когда я выполняю запрос на выборку.

Количество является неправильным значением. ProductB имеет оба размера и, кажется, в countForfetchRequest учитывается дважды, но, очевидно, возвращается только один раз при вызове executeFetchRequest.

Я пробовал установить setReturnsDistinctResults:YES без эффекта.

Ответы [ 2 ]

1 голос
/ 09 ноября 2010

Я немного изменил предикат в ответе.Обратите внимание, что те же соображения относительно проблем с синтаксическим анализом, с которыми вы можете столкнуться (приведенные в одном из моих предыдущих комментариев), по-прежнему применимы.Я предполагаю, что у вас есть несколько размеров, скажем sizeA, sizeB, sizeC и т. Д. Вам нужен подзапрос, чтобы правильно обработать ваши отношения ко многим в Core Data, как показано в следующем предикате

EDIT:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(sizes.@count == 1 || sizes.@count == 2) && (1 == SUBQUERY(sizes, $sub, $sub.#size == %@ || $sub.#size == %@).@count  || 2 == SUBQUERY(sizes, $sub, $sub.#size == %@ || $sub.#size == %@).@count)", yourSizeAvariable, yourSizeBvariable];

Дайте мне знать, если это работает правильно для вас.

0 голосов
/ 10 ноября 2010

Я думаю, что когда вы делаете подсчет, он подсчитывает количество строк, возвращаемых из запроса sql.Когда вы запрашиваете таблицу размеров, вы получаете обратно 3, потому что эквивалентный sql вернул бы 3 строки.

Когда вы делаете выборку, вы получаете 2, потому что вы получите только два объекта продукта.Однако, если вы заглянули внутрь этих продуктов по количеству объектов размера, вы найдете 3.

О, и выбранное отличное не будет работать, поскольку у вас есть 3 уникальных набора значений: -)

...