CoreData:一对多关系显示问题

时间:2012-03-30 16:25:52

标签: uitableview core-data one-to-many nsfetchedresultscontroller nsfetchrequest

我意识到这是非常冗长的,但我正在研究我的第一个CoreData项目,尽管阅读了所有资源,但我发现它还没有完全沉没。到目前为止,我已经得到了它保存和坚持一切没关系,但我似乎无法让关系正常工作。 我有一个表格视图,显示Exersize分类,它移动到一个表格,显示其相关的Exersizes(一对多)。

(尝试发布图片,但我还没有足够的重复点)但是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

以下是exersizes的代码(非常相同)

// 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 个答案:

答案 0 :(得分:0)

f.perdition,

你写道:

  

虽然这似乎可以用于创建对象,但我看到了   他们在tableviews上我还没有实现   coreDataGeneratedAccessors,它们如何以及在何处适合   图片?

核心数据动态创建这些方法的实现。标题是为了您的方便和编译器类型检查。

这是一个简单的谓词,用于在exersize实体上查找练习名称:

NSPredicate *p = [NSPredicate predicateWithFormat: @"%K == %@", @"name", @"Push Up"];

安德鲁

P.S。您可能想要更正单词练习的拼写。