2013-07-10 49 views
0

我不得不說,論壇上的每個人對我學習核心數據的嘗試都非常有幫助。將屬性值添加到核心數據中IF值已存在

我添加的屬性值來我的核心數據實體和當用戶選擇一個行創建的關係如下圖所示:

- (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 hereenter image description here

的要求 -

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

你可以分享你的'ManagedObjectModel'嗎? 'RoutineDetails'與'RoutineEntity'是一對多的關係嗎? –

+0

@MarkoNikolovski我已經更新了這個問題。是的,這些實體處於一對多的關係。我已經包含了實體的快照。謝謝 – Sgillon

回答

0

你並不需要關心這一點,你可以簡單地插入一個新的RoutineDetails對象和核心數據負責剩下的照顧。當您自動生成數據庫表的NSManagedObject子類時,核心數據會自動爲所有關係生成訪問器方法,您可以在其中添加和刪除Routines中的RoutineDetails的單個或多個實例。

要創建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; 

比你可以直接通過Routines對象訪問所有RoutineDetails對象(你會得到一個NSSetRoutineDetails),此外,您可以添加新對象

[routineEntity addRoutineDetailsObject:routineEntityDetail]; 

不關心對象是否已存在與否。核心數據將做正確的事情。

關於核心數據的評論:核心數據可以有很多樣板代碼,用於獲取簡單的東西。看看MagicalRecord這個項目,它不那麼冗長並且沒有奇蹟。

編輯:每當你以前創建NSManagedObject,現在你可以直接使用自己的類,即Routines。這樣你就可以訪問所有的「新功能」。

+0

您好Marko,謝謝你的出色答案。我現在得到的唯一問題是它說'NSManagedObject'沒有可見的@interface聲明選擇器addRoutinedetObject'。我從來沒有使用過子類。 – Sgillon

+0

您是否創建了NSManagedObject類?另外,不要忘記將它們包含在'.m'文件中。 –

+0

啊,而且當你創建對象,而不是:'NSManagedObject * routineEntity'使用'例程* routineEntity' –