我有一个核心数据实体,其属性名为“值”,该属性经常重复。我希望仅检索唯一值(完成)以及每个值的出现频率,以便我可以按该属性进行排序(我正在基于现有用户输入构建自动完成功能,因此知道某输入出现的频率是必要)。
我的提取请求当前如下所示:
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;
我有点受不了这个。有任何想法吗?
提前致谢!
最佳答案
我不喜欢这个,但是...
您可以使用与您要查找的值完全匹配的谓词来执行其他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是一个对象,因此也许您可以拥有一个静态字典,该字典将值作为键,将计数作为值。
我可能会首先尝试3号(看起来很简单),但是我从来没有做过这样的事情。因此,我不确定核心数据中是否存在类变量。