2011-11-03 114 views
0

我有一個Core Data實體,其中有一個名爲'value'的屬性,它經常重複。我希望只檢索唯一值(完成)以及每個值的出現頻率,以便我可以根據該屬性進行排序(我正在基於現有的用戶輸入構建自動完成功能,因此知道某個輸入出現的頻率是多少必要)。核心數據中的不同項目

我的讀取請求目前看起來是這樣的:

NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:self.managedObjectContext]; 
NSDictionary *entityProperties = [entity propertiesByName]; 
[fetchRequest setEntity:entity]; 

[fetchRequest setFetchBatchSize:10]; 
[fetchRequest setFetchLimit:20]; 
[fetchRequest setReturnsDistinctResults:YES]; 
[fetchRequest setResultType:NSDictionaryResultType]; 

[fetchRequest setPropertiesToFetch:[NSArray arrayWithObject:[entityProperties objectForKey:@"value"]]]; 

NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"value" ascending:YES] autorelease]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
[fetchRequest setSortDescriptors:sortDescriptors]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"value BEGINSWITH[c] %@",predicateString]; 
[fetchRequest setPredicate:predicate]; 

return fetchRequest; 

我有點堅持這一點。有任何想法嗎?

在此先感謝!

+0

您是否看到此答案? http://stackoverflow.com/questions/2785844/how-to-fetch-distinct-values-in-core-data – D33pN16h7

+0

是的,這讓我有不同的價值觀,但我需要計算它們中每一個的存在數量。 – NathanGaskin

回答

1

我不喜歡這一個,但...
你可以做一個與你正在尋找的值完全匹配的謂詞的其他fetchRequest。允許重複,然後有數組的數量。

這一個更好,但更多的工作在前面。
另一種方法可能是在數據模型中有一個派生屬性,用於在創建它們時跟蹤重複計數。 (與選項,你可以很容易地排序重複計數)


好了所得財產。 首先,您需要繼承NSManagedObject並在您的數據模型中使用該子類。 (在Xcode 3中有一種快速創建的方法,但我不知道在Xcode 4中)但是如果您將它命名爲與您的實體相同,我認爲核心數據會將其提取出來。

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 
@interface Person : NSManagedObject 
@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSString * firstLetterOfName; 
@property (nonatomic, retain) NSString * phoneNumber; 
@end 

而在你實現你需要做這樣的事情(有在Xcode 4的代碼片段,讓你開始,但在其中的一個錯字,除非它已經被修正)

#import "Person.h" 
@implementation Person 
@dynamic name, phoneNumber, firstLetterOfName; 
- (void)setName:(NSString *)value { 
[self willChangeValueForKey:@"name"]; 
[self setPrimitiveValue:value forKey:@"name"]; 
self.firstLetterOfName = [value substringToIndex:1]; 
[self didChangeValueForKey:@"name"]; 
} 
@end 

您可以看到每次設置Name時都會設置firstLetterOfName。
你可以用關係做同樣的事情。 因此,當你添加一個項目的關係,你應該能夠查找你的關係。

這是一個類似的例子,我需要找到我添加的對象是否具有組的最低價格,因爲派生屬性調用isMeilleurPrixAvecPrixElment。 (這是舊代碼,所以我不記得它的每一個細節,它已經在OSX.4已經完成),這取決於您的數據模型

- (void)addPrixHistoriqueObject:(PrixElement_MO *)value 
{ 
NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1]; 

[self willChangeValueForKey:@"prixHistorique" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects]; 

if ([self isPrixRegulierAvecPrixElement:value]) 
    [self enleveL_AutrePrixRegulierPourCommerceDeCePrixElement:value]; 

if ([self isMeilleurPrixAvecPrixElment:value]) 
    [self echangeMeilleurPrixAvecCePrixElement:value]; 

[[self primitivePrixHistorique] addObject:value]; 
[self didChangeValueForKey:@"prixHistorique" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects]; 

[changedObjects release]; 
} 

在以評論

響應以及這個方面在你的應用中的重要性,我可以想到3個解決方案。
1-在這方面重新調整數據模型。
2-當設置值用謂詞查詢實體的其餘部分並更新具有計數的屬性時。
3-(我不知道那個,但值得一試)NSManagedObect是一個對象,所以也許你可以有一個靜態字典,它的值是一個鍵值,而count是值。

我也許會先嚐試3號(它看起來很容易),但我從來沒有做過這樣的事情。所以我不確定核心數據中的類變量是否存在。

+0

你能否解釋一下更多如何創建派生屬性並保持更新? – NathanGaskin

+0

感謝您的信息!不幸的是,我沒有計算每個值出現在關係中的次數,而是整個數據集中每個值的存在次數。 我在想我可以爲每個項目添加一個「計數」字段。那麼每次我插入一個新的時候,都要搜索具有相同值的項目並將其所有計數設置爲正確的值?每次我想要檢索它時,都會比必須執行相同的搜索更好。 – NathanGaskin

+0

你所尋求的所有價值都在同一種實體中嗎? –