我正在尝试创建Core Data iPhone应用程序。我跟踪的其中一个实体是汽车,每辆汽车的一个属性是“制造商”。
在我的应用程序的“编辑汽车”部分,我有一个UIPickerView需要加载以前已输入系统的每个独特制造商。我要做的是创建一个NSFetchRequest以获取一组唯一的“制造商”属性,并使用它来填充UIPickerView。
我遇到的问题是,无论数据存储中是否有零记录或100,在元素零处执行的获取请求中始终有一条记录,其值为“”“。
我做错了还是有更简单的方法吗?我希望我能跑一个快速的SQL查询!!!
我的代码如下:
// Populate the manufacturerNameList array
NSManagedObjectContext *moc = [self.selectedLease managedObjectContext];
NSEntityDescription *ed = [NSEntityDescription entityForName:@"Car" inManagedObjectContext:moc];
NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
[fetchRequest setEntity:ed];
// Get only manufacturer and only uniques
[fetchRequest setResultType:NSDictionaryResultType];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"manufacturer",nil]];
[fetchRequest setReturnsDistinctResults:YES];
// Sort by manufacturer in ascending order
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"manufacturer" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSError *error = nil;
self.manufacturerNameList = [moc executeFetchRequest:fetchRequest error:&error];
if (error) {
// Handle the error
}
NSLog(@"The count of self.propertyNameList is %i",[self.propertyNameList count]);
谢谢!
答案 0 :(得分:2)
manufacturerNameList
将是Car
个实体的数组,而不是制造商名称。此外,您需要将NSArray
个NSPropertyDescription
个对象传递给setPropertiesToFetch
,而不仅仅是属性名称。
以下是设置属性的方法:
NSDictionary *entityProperties = [ed propertiesByName];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:[entityProperties objectForKey:@"manufacturer"], nil]];
executeFetchRequest:
的结果将是NSArray
个Car
个实体,因此您必须在循环或其他内容中提取manufacturer
属性值。< / p>
您可能需要考虑创建Manufacturer
实体引用的Car
实体,这样您就可以按照现在尝试的方式查询更多内容。
答案 1 :(得分:1)
另一种方法是为制造商创建一个实体,并在汽车和制造商之间建立关系,以便汽车有一个制造商而制造商有许多汽车:
Car&lt; - &gt;制造商
Manufacturer实体的字符串属性可以是“name”。
然后,您可以通过获取所有制造商对象并查看“名称”属性来获取制造商名称的完整列表。
答案 2 :(得分:0)
最简单的解释是,您的汽车实体的制造商价值为空。当谓词对提取进行排序时,空白字符串将排在第一位。
我会记录整个self.propertyNameList
,看看你实际上得到了什么。