gpt4 book ai didi

iphone - 计算核心数据中的不同项目

转载 作者:行者123 更新时间:2023-11-29 04:55:51 25 4
gpt4 key购买 nike

我有一个核心数据实体,其属性名为“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;

我对这个有点困惑。有任何想法吗?

提前致谢!

最佳答案

我不喜欢这个,但是...
您可以使用与您正在寻找的值完全匹配的谓词执行另一个 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是一个对象,所以也许你可以有一个静态字典,其中值作为键,计数作为值。

我可能会先尝试第三个(它看起来很简单),但我从来没有做过这样的事情。所以我不确定核心数据中类变量是否存在。

关于iphone - 计算核心数据中的不同项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7998052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com