我在该站点上有一个类似于“标签”功能的输入字段:用户输入一堆单词或短语,这些单词或短语显示在自己的气泡中。这些单词/短语与日记条目(基本标记日记条目)相关联,在概述页面上,我想显示这些单词/短语的前5位或前10位。
我最初的实现是在每个日记条目中存储一个字符串,该字符串基本上将所有这些单词/短语连接在一起。读取数据时,我会根据预定义的分隔符拆分此字符串。效果很好,但是如果我有很多条目包含这些词/短语的数量,找到前5/10将是非常糟糕的。有什么更好的方法呢?
所以,我有这样的事情:
@interface JournalEntry : NSManagedObject
{
@property (nonatomic, retain) NSNumber * entryId;
@property (nonatomic, retain) NSDate * dateCreated;
@property (nonatomic, retain) TagsInfo *tagsInfo;
}
@interface TagsInfo : NSManagedObject
{
@property (nonatomic, retain) JournalEntry * journalEntry;
@property (nonatomic, retain) NSString * tagString;
}
我认为在正常的数据库设置中,我会为标签创建一个表,并在其中存储[journalEntryId,tagEntry]之类的内容。每个日记帐分录都有很多这些分录。这应该是相似的吗?
最佳答案
这就是我要做的,创建一个新的Tag
实体,该实体与JournalEntry
具有多对多的关系。将现有的TagInfo
迁移到Tag
并更新关系。Tag
至少具有以下内容:
与JournalEntry
的一对多关系
称为tagString
的字符串(或tagName
或其他名称)。JournalEntry
将与Tag
建立多对多关系。 tagString
将是唯一的,因为每个Tag
可能与多个日记帐分录相关。
然后,您可以像这样获取标签以及每次使用次数的计数:
NSExpression *tagCountExpression = [NSExpression expressionWithFormat:@"count(journalEntries)"];
NSExpressionDescription *tagCountExprDescription = [[NSExpressionDescription alloc] init];
tagCountExprDescription.name = @"count";
tagCountExprDescription.expression = tagCountExpression;
tagCountExprDescription.expressionResultType = NSInteger64AttributeType;
NSFetchRequest *tagFetch = [NSFetchRequest fetchRequestWithEntityName:@"Tag"];
[tagFetch setResultType:NSDictionaryResultType];
tagFetch.propertiesToFetch = @[ @"tagString", tagCountExprDescription ];
tagFetch.propertiesToGroupBy = @[ @"tagString" ];
那会给你一系列的字典。每个标签将包含一个
tagString
和count
该标签具有多少个相关日记帐分录。您必须自己对其进行排序(不能将表达式用作排序描述符)。关于ios - CoreData和最常用的词已使用/已标记,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28100811/