iPhone核心数据 - 简单查询

时间:2010-01-20 22:14:23

标签: iphone core-data nsfetchrequest

我正在尝试创建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]);

谢谢!

3 个答案:

答案 0 :(得分:2)

manufacturerNameList将是Car个实体的数组,而不是制造商名称。此外,您需要将NSArrayNSPropertyDescription个对象传递给setPropertiesToFetch,而不仅仅是属性名称。

以下是设置属性的方法:

NSDictionary *entityProperties = [ed propertiesByName];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:[entityProperties objectForKey:@"manufacturer"], nil]];

executeFetchRequest:的结果将是NSArrayCar个实体,因此您必须在循环或其他内容中提取manufacturer属性值。< / p>

您可能需要考虑创建Manufacturer实体引用的Car实体,这样您就可以按照现在尝试的方式查询更多内容。

答案 1 :(得分:1)

另一种方法是为制造商创建一个实体,并在汽车和制造商之间建立关系,以便汽车有一个制造商而制造商有许多汽车:

Car&lt; - &gt;制造商

Manufacturer实体的字符串属性可以是“name”。

然后,您可以通过获取所有制造商对象并查看“名称”属性来获取制造商名称的完整列表。

答案 2 :(得分:0)

最简单的解释是,您的汽车实体的制造商价值为空。当谓词对提取进行排序时,空白字符串将排在第一位。

我会记录整个self.propertyNameList,看看你实际上得到了什么。