将属性值添加到核心数据IF值已存在

时间:2013-07-10 13:47:16

标签: ios core-data nsmanagedobject

我不得不说论坛上的每个人都对我学习核心数据的尝试非常有帮助。

我正在向我的核心数据实体添加属性值,并在用户选择行时创建关系,如下所示:

- (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

您的意见和评论将不胜感激。

enter image description here enter image description here

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;

1 个答案:

答案 0 :(得分:0)

您不需要关心这一点,您只需插入一个新的RoutineDetails对象,Core Data就可以完成剩下的工作。当您自动生成数据库表的NSManagedObject子类时,Core Data会自动为所有关系生成访问器方法,您可以从RoutineDetails添加和删除Routines的单个或多个实例。

要创建NSManagedObject子类,请转到ManagedObjectModel点击Editor->Create NSManagedObject subclass…并为您的实体创建子类:

Create subclasses

在新的子类中,您将看到如下方法:

@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。这样您就可以访问所有“新功能”。