Это всего лишь идея, вы должны разработать ее самостоятельно.
Вы можете указать, чтобы возвращать только отдельные результаты из вашей выборки с setReturnsDistinctResults
из NSFetchRequest
после указания вашего ключа (cardId) как propertiesToFetch
. Таким образом, вы делаете первую выборку всех отдельных объектов и копируете результат в изменяемый массив, который я назову distinctArray
. Затем вы делаете вторую выборку, где запрашиваете ВСЕ объекты, таким образом, setReturnsDistinctResults
отключено в completeArray
. Вы перебираете элементы distinctArray
и удаляете каждый элемент из completeArray
. То, что остается в completeArray
, будет объектами для удаления.
Более низкий уровень реализации этого (возможно, также более эффективного) будет удвоенным для цикла. Вы выбираете только все объекты в completeArray
и выполняете старый добрый двойной цикл:
NSMutableArray* objectsToDelete = [[NSMutableArray alloc] initWithCapacity:how_many_duplicates_you_expect];
for (int i = 0; i < [completeArray count]; i++) {
for (j = i + 1; j < [completeArray count]; j++) {
MOObject* objecti = [completeArray objectAtIndex:i];
MOObject* objectj = [completeArray objectAtIndex:j];
if (objecti.cardId == objectj.cardId) {
[objectsToDelete addObject:objectj];
}
}
}
В конце будут все объекты, которые будут удалены в objectsToDelete
. Обратите внимание, что если в вашей базе данных более двух вхождений одного и того же объекта, могут быть дубликаты даже в objectsToDelete
, поэтому проверьте его перед удалением.