CoreData get distinct values of Attribute

Próbuję skonfigurować moje NSFetchRequest do podstawowych danych, aby pobrać unikalne wartości dla określonego atrybutu w encji. tj.

Podmiot posiadający następujące informacje:

  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   |

Jak skonfigurować prośbę o zwrot tablicy z: Johnem, Betty, Edwardem?

Author: albertamg, 2011-08-09

3 answers

Powinieneś użyć backing store, aby pomóc ci uzyskać różne rekordy.

Jeśli chcesz uzyskać tablicę z tylko John, Betty, Edward oto jak to zrobić:

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);
 70
Author: AlleyGator,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-28 09:10:31

Próbujesz użyć podstawowych danych jako proceduralnej bazy danych, a nie jako menedżera Wykresów obiektowych zgodnie z przeznaczeniem API, więc nie znajdziesz łatwego sposobu na to.

Nie ma prostego sposobu, aby to zrobić w Core Data, ponieważ Core Data dotyczy obiektów zamiast wartości. Ponieważ zarządzane obiekty mają gwarancję unikalności, Podstawowe Dane nie przejmują się wartościami każdego obiektu, duplikatami lub wartościami innych obiektów.

Aby znaleźć unikalne wartości:

  1. wykonaj fetch według określonej wartości. To da ci tablicę słowników z kluczem name i wartością samego ciągu nazwy.
  2. na zwracanej tablicy w (1) Użyj operatora zbioru zbiorów, aby zwrócić zestaw unikalnych wartości.

Więc coś w stylu:

NSSet *uniqueNames=[fetchedNameDicts valueForKeyPath:@"@distinctUnionOfSets.name"];

... który zwróci zestaw obiektów NSString z unikalną wartością.

 15
Author: TechZen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-09 20:05:16

Spójrz na pobieranie określonych wartości właściwości , nie jest konieczne używanie zestawu do uzyskania odrębnych wartości.

 5
Author: Alexandre L Telles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-10 01:15:43