我不得不说论坛上的每个人都对我学习核心数据的尝试非常有帮助。
我正在向我的核心数据实体添加属性值,并在用户选择行时创建关系,如下所示:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
UIAlertView *messageAlert = [[UIAlertView alloc]
initWithTitle:@"Row Selected" message:@"Added to Routine!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
NSManagedObjectContext *context = [self managedObjectContext];
// Create a new device
ExcerciseInfo *info = [_fetchedResultsController objectAtIndexPath:indexPath];
NSManagedObject *routineEntity = [NSEntityDescription insertNewObjectForEntityForName:@"Routines"inManagedObjectContext:context];
NSManagedObject *routineEntityDetail = [NSEntityDescription insertNewObjectForEntityForName:@"RoutinesDetails" inManagedObjectContext:context];
[routineEntityDetail setValue:routineEntity forKey:@"routineinfo"];
[routineEntity setValue: RoutineText forKey:@"routinename"];
[routineEntityDetail setValue: info.details.muscle forKey:@"image"];
如何添加IF statement
,如果routinename
已经存在,新条目将被添加到现有关系中?
目前的代码是否可以轻松实现?因此,测试例程将被分组而不是单独显示,详细视图将包括两个条目。 NSPredicate
在这里适合吗?或者也许使用distinctUnionOfObjects
?
您的意见和评论将不胜感激。
AS REQUESTED -
- (NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Routines" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *sort = [[NSSortDescriptor alloc]
initWithKey:@"routinename" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
[fetchRequest setFetchBatchSize:20];
NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:managedObjectContext sectionNameKeyPath:nil
cacheName: nil];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
答案 0 :(得分:0)
您不需要关心这一点,您只需插入一个新的RoutineDetails
对象,Core Data就可以完成剩下的工作。当您自动生成数据库表的NSManagedObject
子类时,Core Data会自动为所有关系生成访问器方法,您可以从RoutineDetails
添加和删除Routines
的单个或多个实例。
要创建NSManagedObject
子类,请转到ManagedObjectModel
点击Editor->Create NSManagedObject subclass…
并为您的实体创建子类:
在新的子类中,您将看到如下方法:
@interface Routines (CoreDataGeneratedAccessors)
- (void)addRoutineDetailsObject:(RoutineDetails *)value;
- (void)removeRoutineDetailsObject:(RoutineDetails *)value;
- (void)addRoutineDetails:(NSSet *)values;
- (void)removeRoutineDetails:(NSSet *)values;
您可以直接通过RoutineDetails
对象访问所有Routines
(您将NSSet
获得RoutineDetails
),此外,您可以添加新对象
[routineEntity addRoutineDetailsObject:routineEntityDetail];
如果对象已经存在,则不关心。核心数据将做正确的事。
关于核心数据的评论:核心数据可以有很多样板代码,用于获取简单的东西。看一下MagicalRecord项目,这个项目不那么冗长,也不例外。
编辑:无论您何时创建NSManagedObject
,现在都可以直接使用自己的类,即Routines
。这样您就可以访问所有“新功能”。