我有一个类似于"标签的输入字段"此网站上的功能:用户输入在他们自己的气泡中显示的一堆单词或短语。这些单词/短语与日记帐分录相关联(基本上标记日记帐分录),在概述页面上,我想显示这些单词/短语的前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]的内容。每个日记帐分录都会有一堆这些条目。这应该类似吗?
答案 0 :(得分:1)
这就是我要做的,创建一个与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
标记有多少相关日记帐分录。你必须自己排序(不能使用表达式作为排序描述符)。