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:一对多关系显示问题的主要内容,如果未能解决你的问题,请参考以下文章

如何管理 Core Data 中的一对多关系?

与 coredata 的一对多关系

快速获取具有一对多关系的核心数据

在 iPhone 应用程序中显示一对多关系的值的计数

CoreData关系一对一无法显示属于每个Listing的标签数组[重复]

核心数据:重启时排序的一对多关系