Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone核心数据-简单查询_Iphone_Core Data_Nsfetchrequest - Fatal编程技术网

iPhone核心数据-简单查询

iPhone核心数据-简单查询,iphone,core-data,nsfetchrequest,Iphone,Core Data,Nsfetchrequest,我正在尝试创建一个核心数据iPhone应用程序。我跟踪的实体之一是汽车,每辆汽车的一个属性是“制造商” 在我的应用程序的“编辑汽车”部分,我有一个UIPickerView,它需要加载以前输入到系统中的每个唯一制造商。我试图做的是创建一个NSFetchRequest来获取一个唯一的“制造商”属性数组,并使用它来填充UIPickerView 我遇到的问题是,无论数据存储中有0条记录还是100条记录,在执行的fetch请求中,元素0处总是有一条记录的值为@“” 我是做错了还是有更简单的方法?我希望我能

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

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

我遇到的问题是,无论数据存储中有0条记录还是100条记录,在执行的fetch请求中,元素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]);

谢谢

最简单的解释是,您的汽车实体的制造商值为空。当谓词对提取排序时,空白字符串将排名第一。p>
我会记录整个
self.propertyNameList
,看看你到底得到了什么

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

以下是设置属性的方式:

NSDictionary *entityProperties = [ed propertiesByName];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:[entityProperties objectForKey:@"manufacturer"], nil]];
executeFetchRequest:
的结果将是
Car
实体的
NSArray
,因此您必须在循环或其他内容中提取
manufacturer
属性值


您可能想考虑创建一个<代码>制造商>代码>实体,您的<代码> Cub/Cord>实体引用,这将允许您以目前尝试的方式查询更多信息。

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


汽车我完全明白你的意思,这肯定会给我提供更多的灵活性,但问题是汽车是该领域唯一的实体,我担心增加另一个实体(制造商)担心会使代码总体上更加复杂——考虑到我唯一想与制造商做的就是对照汽车实体跟踪他们。鉴于此,您认为此代码是实现此目的的最简单方法吗?在这种情况下,我认为问题在于您将属性名称而不是NSPropertyDescriptions传递给setPropertiesToFetch,然后将结果视为汽车实体,不是制造商字符串。制造商应该是自己的实体,与汽车有关系。如果你只是把它作为汽车实体的一个属性,那么你就限制了你的设计,而且与你仅仅把它作为自己的实体相比,要保持制造商的独特性会有更多的困难。