ios - 核心数据 : Insert and delete with To many relationship

标签 ios objective-c core-data

我正在制作一个包含核心数据的简单日记应用。

主模型(Journal)将包含一个标题和一个正文。 每个条目可以有一个或多个标签。

要插入一个新的(期刊),我只是这样做:

Journal *newJournal  [NSEntityDescription insertNewObjectForEntityForName:@"Journal"
                                             inManagedObjectContext:context];
//Save 

问题一:为词条添加标签的正确方法是什么?

我可以这样做:

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 个标签:乐趣、运动、假期”

enter image description here

最佳答案

首先,您需要在 Journal 和 Tag 模型之间建立多对多关系,否则您将无法将同一个 Tag 分配给多个 Journal 条目

enter image description here

答案 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];

您可以在 Predicates Programming Guide 中阅读有关谓词的更多信息

关于ios - 核心数据 : Insert and delete with To many relationship,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21732140/

相关文章:

ios - 重新加载带有动画的表格 View 单元格(Swift)

ios - 如何在 iOS 上的 View 之间切换

ios - 不能做整数==比较

ios - SceneKit 节点的奇怪行为

iphone - 如何正确格式化这些日期?

ios - 使用 CoCoapods 添加 2 个平台的库

ios - 在 iOS UIWebView 中为 iPhone 和 iPad 加载不同的 HTML

swift - 文本与应删除的文本重叠

objective-c - 子上下文中与 NSManagedObject 的绑定(bind)仅适用于新对象

iphone - NSOperation 和 CoreData 线程