2010-01-20 93 views
1

我想創建一個核心數據iPhone應用程序。我追蹤的其中一個實體是汽車,每輛汽車的一個屬性是「製造商」。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

最簡單的解釋是,您有一個汽車實體具有空的製造商價值。當謂詞對提取進行排序時,空字符串將排在第一位。

我會記錄整個self.propertyNameList,看看你實際回來。

2

manufacturerNameList將會是一個Car實體數組,而不是製造商名稱。此外,您還需要將NSArrayNSPropertyDescription對象傳遞給setPropertiesToFetch而不僅僅是屬性名稱。

這裏是你如何設置屬性:

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

executeFetchRequest:的結果將是CarNSArray實體,所以你再有一個循環或東西提取manufacturer屬性值。

您可能需要考慮創建一個實體,您的Car實體引用該實體,這將允許您按照您現在嘗試的方式查詢更多信息。

+0

我完全明白你的意思,它肯定會爲我提供更多的靈活性,但事實是Cars是域中唯一的實體,我擔心添加另一個實體(製造商)擔心會使整體代碼更加複雜 - 因爲我唯一想要跟製造商做的事情就是追蹤它們與汽車實體。 鑑於此,您認爲此代碼是完成此操作的最簡單方法嗎? – 2010-01-20 22:47:11

+0

在這種情況下,我認爲問題是您傳遞屬性名稱而不是NSPropertyDescriptions setPropertiesToFetch,然後將結果視爲汽車實體,而不是製造商字符串。 – 2010-01-20 23:01:37

1

另一種方法是創建一個廠商的實體,有車有廠商這樣有車有一個製造商和製造商之間的關係有許多汽車:

汽車< < - >製造商

製造商實體可以有一個字符串屬性的「名稱」。

然後,您可以通過獲取所有制造商對象並查看「名稱」屬性來獲取製造商名稱的完整列表。

+0

製造商一定是它自己的實體與汽車的關係。如果您將其作爲汽車實體的財產,那麼您將限制您的設計,並且在保持製造商獨特性方面遇到更多困難,而不是僅僅將其作爲自己的實體。 – 2010-01-21 01:20:16