1

我正在尝试创建一个 Core Data iPhone 应用程序。我正在跟踪的实体之一是汽车,每辆汽车的一个属性是“制造商”。

在我的应用程序的“编辑汽车”部分,我有一个 UIPickerView 需要加载每个先前已输入系统的唯一制造商。我要做的是创建一个 NSFetchRequest 来获取一组独特的“制造商”属性并使用它来填充 UIPickerView。

我遇到的问题是,无论数据存储中有 0 条记录还是 100 条记录,在元素 0 处执行的提取请求中总是有一条记录,其值为 @""。

我做错了还是有更简单的方法来做到这一点?我希望我可以运行一个快速的 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]);

谢谢!

4

3 回答 3

2

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

以下是设置属性的方法:

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

结果executeFetchRequest:将是一个NSArray实体Car,因此您必须manufacturer在循环或其他内容中提取属性值。

您可能需要考虑创建一个Manufacturer您的Car实体引用的实体,这将允许您以您现在尝试的方式进行更多查询。

于 2010-01-20T22:29:23.010 回答
1

另一种方法是为制造商创建一个实体,并在 Car 和 Manufacturer 之间建立关系,这样一辆车有一个制造商,而制造商有很多辆汽车:

汽车 <<--> 制造商

制造商实体可以具有其“名称”的字符串属性。

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

于 2010-01-20T22:30:27.190 回答
0

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

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

于 2010-01-20T22:28:04.653 回答