I'm searching how to select all values for a specific attribute in an entity in Core Data.
Here my model:
I have an entity named "Countries" with 3 attributes of type "String":
- name_en
- name_fr
- name_de
I display the values on a UITableView, but I would like only show the values from name_en OR name_fr OR name_de based on the user default language. At the moment, all the values are selected (name_en, name_fr and name_de).
The solution (Thanks to Simon):
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K MATCHES %@", [NSString stringWithFormat:@"name_%@",[Config getCurrentLocale]], @".{1,}"];
Where [Config getCurrentLocale] returns me "fr" OR "de" OR "en".
Next, apply this predicate to the request:
NSFetchRequest * request = [self defaultRequest];
request.predicate = predicate;
self.fetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:context
sectionNameKeyPath:nil
cacheName:nil];
========= Relative to my problem (Resolved now) ==========
Here is my method where I build the fetch request:
-(NSFetchRequest *) defaultRequest
{
NSFetchRequest * request = [[NSFetchRequest alloc] init];
NSEntityDescription * entity = [NSEntityDescription entityForName:self.entityName
inManagedObjectContext:appDelegate.managedObjectContext];
NSDictionary *attributes = [entity attributesByName];
// Put some stuff here to "filter" the request and show only name_en OR name_fr OR name_de ?
request.entity = entity;
request.fetchBatchSize = 20;
//request.fetchLimit = 50;
request.sortDescriptors = self.defaultSortDescriptors;
return request;
}
Thank you guys for your help.
EDIT 1
Here is the data source methods of my subclass of UITableViewController:
#pragma mark - UITableView
- (NSFetchedResultsController *)fetchedResultsControllerForTableView:(UITableView *)tableView
{
if (tableView == self.searchDisplayController.searchResultsTableView)
return self.searchFetchedResultsController;
if (tableView == self.tableView)
return self.fetchedResultsController;
return nil;
}
#pragma mark DataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return [[[self fetchedResultsControllerForTableView:tableView] sections] count];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [[[[self fetchedResultsControllerForTableView:tableView] sections] objectAtIndex:section] numberOfObjects];
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
return [[[[self fetchedResultsControllerForTableView:tableView] sections] objectAtIndex:section] name];
}
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
{
return [[self fetchedResultsControllerForTableView:tableView] sectionForSectionIndexTitle:title atIndex:index];
}
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
return [[self fetchedResultsControllerForTableView:tableView] sectionIndexTitles];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString * identifier = [self cellIdentifierForIndexPath:indexPath];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (cell == nil)
cell = [self newTableViewCellWithIndentifier:identifier];
// Configure the cell.
[self tableView:tableView configureCell:cell atIndexPath:indexPath];
return cell;
}
EDIT 2:
I try something like this just to show the results in outputs:
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Countries"];
fetchRequest.resultType = NSDictionaryResultType;
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"name_en", nil]];
NSError *error = nil;
NSArray *results = [[AppDelegate sharedInstance].managedObjectContext executeFetchRequest:fetchRequest error:&error];
NSMutableArray *countries = [results valueForKey:@"name_en"];
NSLog(@"Count: %d", countries.count);
Normally, I have around 246 countries in name_en, and the count is 757! So, the sum of name_fr + name_en + name_de... I don't understand why :(
Edit => I found a solution here: How to fetch unique field values (song_type) from core data
Now, I have to adapt my code to works with this piece of code :)