核心数据排序,不显示重复项

时间:2011-11-14 04:33:03

标签: iphone ios core-data

我是核心数据的新手,在查找有关排序的任何信息时遇到了一些困难,并且只获取了指定属性的非重复数据。

我有一个地点列表,他们都有不同的地址,但有些地方有相同的城市。我想取所有城市,不包括重复城市,按字母顺序排列。

最好的方法是拥有2个属性,一个用于城市,另一个用于locationDetails。在city属性中,它只有一个没有重复项的城市列表,在选择城市时,它将获取该城市属性的所有locationDetails?

谢谢,

2 个答案:

答案 0 :(得分:1)

是的,最好的方法是为城市设置一个单独的属性。而且您不需要将实体结构化为唯一。您可以在获取请求中处理唯一的排序和提取。

NSFetchRequest *request=[[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"<your entity name>" inManagedObjectContext:context]];
[request setResultType:NSDictionaryResultType];
[request setPropertiesToFetch:[NSArray arrayWithObject:@"City"]];
request.sortDescriptors=[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"City" ascending:YES]];
[request setReturnsDistinctResults:YES];

注意:此请求返回以City作为其键的字典数组。执行fetch后不要忘记释放NSFetchRequest。

修改

当用户点击某个城市时,请将其存储在某个变量(cityName)中。现在执行另一个获取请求,如:

request.predicate=[NSPredicate predicateWithFormat:@"City = %@",cityName];

您应该使用同一个实体执行此操作。这将仅获取已选择城市名称的对象。现在,您可以通过两种方式进行提取:

  1. 获取整个实体,然后使用该格式进行调度 entityName.Location。在这种情况下,你将得到一个NSArray 对象

  2. 将属性设置为fetch:

    [request setPropertiesToFetch:[NSArray arrayWithObject:@"Location"]];
    
  3. 在第二种情况下,它返回一个NSDictionary(不要忘记将Result Type设置为NSDictionaryResultType)。

答案 1 :(得分:0)

您应构建核心数据模型,以便为每个唯一城市建立一个城市实体,并为相关城市实体提供一对一关系的位置实体(以及一对多反向关系)。城市名称本身不应该是Location实体的一部分。以这种方式构建时,您只需获取所有城市实体。

至于排序,您应该向NSSortDescriptor添加NSFetchRequest。例如:

NSSortDescriptor *sorter;
sorter = [[NSSortDescriptor alloc] initWithKey: @"name" ascending: YES];
[fetchRequest setSortDescriptors: [NSArray arrayWithObject: sortDescriptor]];