CoreData получают различные значения атрибута
Я пытаюсь настроить мои NSFetchRequest
на основные данные, чтобы получить уникальные значения для определенного атрибута в сущности. то есть.
объект со следующей информацией:
name | rate | factor |
_______|______|________|
John | 3.2 | 4 |
Betty | 5.5 | 7 |
Betty | 2.1 | 2 |
Betty | 3.1 | 2 |
Edward | 4.5 | 5 |
John | 2.3 | 4 |
Как настроить запрос для возврата массива с помощью только: John, Betty, Edward?
Ответы
Ответ 1
Вы должны использовать хранилище, чтобы помочь вам получить различные записи.
Если вы хотите получить массив только с Джоном, Бетти, Эдвардом, как вы это сделаете:
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"MyEntity"];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:self.managedObjectContext];
// Required! Unless you set the resultType to NSDictionaryResultType, distinct can't work.
// All objects in the backing store are implicitly distinct, but two dictionaries can be duplicates.
// Since you only want distinct names, only ask for the 'name' property.
fetchRequest.resultType = NSDictionaryResultType;
fetchRequest.propertiesToFetch = [NSArray arrayWithObject:[[entity propertiesByName] objectForKey:@"name"]];
fetchRequest.returnsDistinctResults = YES;
// Now it should yield an NSArray of distinct values in dictionaries.
NSArray *dictionaries = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];
NSLog (@"names: %@",dictionaries);
Ответ 2
Вы пытаетесь использовать Core Data как процедурную базу данных, а не как диспетчер графа объектов, как это предполагалось в API, поэтому вы не найдете простой способ сделать это.
В Core Data нет прямого способа сделать это, потому что Core Data касается объектов вместо значений. Поскольку управляемые объекты гарантированно уникальны, Core Data не очень заботится о каждом значении объекта или о том, являются ли они дубликатами или некоторыми другими значениями объектов.
Чтобы найти уникальные значения:
Итак, что-то вроде:
NSSet *uniqueNames=[fetchedNameDicts valueForKeyPath:@"@distinctUnionOfSets.name"];
..., который вернет набор объектов NSString с уникальным значением.
Ответ 3
Посмотрите Получение определенных значений свойств, нет необходимости использовать Set для получения отдельных значений.