iPhone核心数据-简单查询
Posted
技术标签:
【中文标题】iPhone核心数据-简单查询【英文标题】:iPhone Core Data - Simple Query 【发布时间】:2010-01-20 22:14:23 【问题描述】:我正在尝试创建一个 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]);
谢谢!
【问题讨论】:
【参考方案1】:manufacturerNameList
将是Car
实体的数组,而不是制造商名称。此外,您需要将 NSPropertyDescription
对象的 NSArray
传递给 setPropertiesToFetch
而不仅仅是属性名称。
这是您设置属性的方式:
NSDictionary *entityProperties = [ed propertiesByName];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:[entityProperties objectForKey:@"manufacturer"], nil]];
来自executeFetchRequest:
的结果将是NSArray
的Car
实体,因此您必须在循环或其他内容中提取manufacturer
属性值。
您可能需要考虑创建您的Car
实体引用的Manufacturer
实体,这将允许您以您现在尝试的方式进行更多查询。
【讨论】:
我完全明白你在说什么,它肯定会为我提供更多的灵活性,但问题是汽车是该领域中唯一的实体,我担心添加另一个要担心的实体(制造商)将使代码整体上更加复杂 - 鉴于我想要对制造商做的唯一事情就是跟踪他们与汽车实体。鉴于此,您是否认为这段代码是完成此任务的最简单方法? 在这种情况下,我认为问题在于您将属性名称而不是 NSPropertyDescriptions 传递给 setPropertiesToFetch,然后将结果视为 Car 实体,而不是制造商字符串。【参考方案2】:另一种方法是为制造商创建一个实体,并在汽车和制造商之间建立关系,这样一辆车有一个制造商,一个制造商有很多辆汽车:
汽车 制造商
制造商实体可以有一个字符串属性它的“名称”。
然后,您可以通过获取所有制造商对象并查看“名称”属性来获取制造商名称的完整列表。
【讨论】:
制造商绝对应该是与汽车有关系的自己的实体。如果您将其仅作为 Car 实体上的一个属性,那么您将限制您的设计,并且与仅将其作为自己的实体相比,保持制造商的独特性会遇到更多困难。【参考方案3】:最简单的解释是,您有一个汽车实体,其制造商值为空。当谓词对 fetch 进行排序时,空白字符串将排在第一位。
我会记录整个self.propertyNameList
并查看您实际返回的内容。
【讨论】:
以上是关于iPhone核心数据-简单查询的主要内容,如果未能解决你的问题,请参考以下文章