我正在制作一个包含核心数据的简单日记应用。
主模型(Journal)将包含标题和正文。 每个条目可以有一个或多个标签。
要插入新的(期刊),我只需这样做:
Journal *newJournal [NSEntityDescription insertNewObjectForEntityForName:@"Journal"
inManagedObjectContext:context];
//Save
问题1:在条目中添加标签的正确方法是什么?
我可以这样做:
Tag *tag1 = [NSEntityDescription insertNewObjectForEntityForName:@"Tag"
inManagedObjectContext:context];
Tag *tag2 = [NSEntityDescription insertNewObjectForEntityForName:@"Tag"
inManagedObjectContext:context];
newJournalEntry.tags = [[NSOrderedSet alloc] initWithObjects:tag1,tag2,nil];
// Save card...
...但这将为每个条目创建新标签。我只需要核心数据模型中每个标记的唯一实例。
问题2:如何按标签查询日记帐分录,例如“获取具有 fun 标记的所有日记帐分录”
我还需要获取所有创建的标签并显示它们,例如:“你有3个标签:有趣,运动,度假”
答案 0 :(得分:1)
回答1:您需要在标记和journalEntry之间将模型更改为多对多,然后您需要查询模型以查看标记是否已存在。如果他们这样做,那么您只需将它们链接到您的输入实体。
示例(在伪代码中):
NSOrderedSet tags = nil;
//Create and fetch for the tags you are looking for. Then:
if([[FetchedResultController fetchedObjects] count] > 0) {
tags = [[NSOrderedSet alloc] initWithArray:[FetchedResultController fetchedObjects]];
} else {
//The code you actually have (almost)
Tag *tag1 = [NSEntityDescription insertNewObjectForEntityForName:@"Tag"
inManagedObjectContext:context];
Tag *tag2 = [NSEntityDescription insertNewObjectForEntityForName:@"Tag"
inManagedObjectContext:context];
tags = [[NSOrderedSet alloc] initWithObjects:tag1,tag2,nil];
}
//Then just set your tags
newJournalEntry.tags = tags;
答案2:一旦你实现了答案1,那么你找到那些标签,然后只使用与journalEntry的关系(例如:tags.journal),这应该是一个NSSet。
再次伪代码:
for(Tag *tag in [FetchResultController fetchedObjects]) {
//Get the Journal Entries using: "tag.journal"
NSSet *journalEntriesWithTagRequested = tag.journal;
// Do what you must with journalEntriesWithTagRequested . . .
}
答案 1 :(得分:1)
首先,您需要在Journal和Tag模型之间建立多对多关系,否则您将无法为多个日记条目分配相同的标记
答案1:在将任何代码分配到日记帐分录之前,从商店中获取现有代码:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Tag"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"name IN %@", @[@"tag1", @"tag2"]];
NSArray *tags = [moc executeFetchRequest:fetchRequest error:&error];
然后,您应该仅为缺少的标记创建带有-insertNewObjectForEntityName
的标记。
回答2:
NSError *error;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Journal"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"tags CONTAINS[cd] %@", @"fun"];
NSArray *journalEntries = [moc executeFetchRequest:fetchRequest error:&error];
中详细了解谓词