CoreData:一对多关系显示问题
Posted
技术标签:
【中文标题】CoreData:一对多关系显示问题【英文标题】:CoreData: One-To-Many Relationship Display Issue 【发布时间】:2012-03-30 16:25:51 【问题描述】:我意识到这很长,但我目前正在处理我的第一个 CoreData 项目,尽管阅读了所有资源,但我发现它还没有全部深入。到目前为止,我已经保存并坚持一切都很好,但是我似乎无法让这种关系正常工作。 我有一个显示 Exersize 类别的表格视图,该视图移动到显示其关联的 Exersize(一对多)的表格。
(尝试发布图像,但我还没有足够的代表点)但是 dataModel 看起来像这样
ExersizeCategory>Exersize
从我读过的所有内容中,我相信我可能需要使用谓词来过滤结果,但我对这实际上是如何工作的以及天气情况感到困惑,我什至实际上是在创建和保存 Exersize类别和 Exersizes 对象适当地使关系首先起作用。
这是我创建和保存的方式(还将其名称设置为文本字段条目)
ExersizeCategory *exersizeCategory = [NSEntityDescription insertNewObjectForEntityForName:@"ExersizeCategory"
inManagedObjectContext:self.managedObjectContext];
exersizeCategory.name = self.textField.text;
[self.managedObjectContext save:nil]; // write to database
这是练习的代码(几乎相同)
// Create a new instance of the entity
exersize = [NSEntityDescription insertNewObjectForEntityForName:@"Exersize"
inManagedObjectContext:self.managedObjectContext];
exersize.name = self.textField.text;
[self.managedObjectContext save:nil]; // write to database
虽然这似乎在创建对象时有效,而且我在 tableviews 上看到了它们,但我还没有实现 coreDataGeneratedAccessors,但它们如何以及在哪里适合图片?
@interface ExersizeCategory (CoreDataGeneratedAccessors)
(void)addExersizesObject:(Exersize *)value;
(void)removeExersizesObject:(Exersize *)value;
(void)addExersizes:(NSSet *)values;
(void)removeExersizes:(NSSet *)values;
我应该提到我正在使用由斯坦福大学创建的 CoreDataTableViewController 类,它似乎减少了您需要编写的 fetch 代码量(我通过我在 www.timroadly.com 上的教程发现) .旁注:最好不要将其子类化并仅使用我在 .h 中注意到的标准方式,它声明其版权归斯坦福所有,因此我不确定是否可以在要发布的应用程序中使用它?
这是我当前获取以显示 Exersizes 的方式
- (void)setupFetchedResultsController
// 1 - Decide what Entity you want
NSString *entityName = @"Exersize"; // Put your entity name here
NSLog(@"Setting up a Fetched Results Controller for the Entity named %@", entityName);
// 2 - Request that Entity
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName];
// 3 - Filter it if you want
//currently unsure about this!
//request.predicate = [NSPredicate predicateWithFormat:@""];
// 4 - Sort it if you want
request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name"
ascending:YES
selector:@selector(localizedCaseInsensitiveCompare:)]];
// 5 - Fetch it
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:self.managedObjectContext
sectionNameKeyPath:nil
cacheName:nil];
[self performFetch];
我知道我错过了实现这一点的关键部分,但我只是不确定是哪一个以及在哪里。 我只在核心数据上呆了几天,所以学习起来非常艰巨!
感谢任何可以阐明/回答/甚至将我推向正确方向的人!
【问题讨论】:
【参考方案1】:f.perdition,
你写:
虽然这似乎在创建对象时有效,但我看到了 它们在我尚未实现的 tableviews 上 coreDataGeneratedAccessors,它们如何以及在哪里适合 图片?
Core Data 动态创建这些方法的实现。标题是为了您的方便和编译器类型检查。
这是一个简单的谓词,用于在您的 exersize
实体上查找练习名称:
NSPredicate *p = [NSPredicate predicateWithFormat: @"%K == %@", @"name", @"Push Up"];
安德鲁
附:您可能需要更正单词练习的拼写。
【讨论】:
你好,andrew good 对拼写大喊大叫,但为了保持一致性,我暂时保持不变。在尝试了更多的东西和更多的阅读之后,我相信我已经正确获取它但是当我创建 exersize 对象时,我似乎无法将它放在关系中,因为 exersize 的 NSSet 计数保持在 0。我'已经尝试过 [exersizeCategory addExersizesObject:exersize];但这似乎不起作用?我已经尝试了所有我能找到的解决方案,但我仍然在某个地方出错,你有什么明显的错误吗?再次感谢 f.perdition,每个 CD 关系都有一个逆关系。因此,如果关系是一对多而逆是一对一,则可以通过简单的赋值来建立关系。如:exercise.exercises = exercises;
。安德鲁
安德鲁,我似乎无法让它工作,和以前一样的问题。正在创建的 exerciseCategory 对象被提取并显示为它们应该但是练习本身没有。通过打印语句,我可以看到托管对象上下文正在传递并且正在创建一些东西,但是 NSSet 保持为空,我猜测的 tableview 也是如此,因为它获取关联的条目并且没有添加任何东西它什么都没有获取。任何想法可能会发生什么?如果它有助于这种情况,我可以更新我的帖子以显示更多代码?干杯人!
嗨,你有没有找到解决办法,我有完全相同的问题/问题?....非常感谢你提前回复。以上是关于CoreData:一对多关系显示问题的主要内容,如果未能解决你的问题,请参考以下文章