Передать данные из листа в insertNewObject в родительских / дочерних отношениях - PullRequest
0 голосов
/ 24 января 2012

У меня есть проблема, чтобы вставитьNewObject в сущность, являющуюся дочерней в отношениях родитель / потомок. Это приложение CoreData с локальной базой SQLite. В главном окне представлены 2 объекта с двумя табличными представлениями. При использовании contentSet в таблице для дочернего элемента будут отображаться только данные, относящиеся к выбранному родительскому элементу.

Добавление данных к дочернему элементу выполняется путем показа листа с таблицей элементов, поступающих от третьего объекта. Пользователь должен выбрать из этой таблицы, затем нажать Добавить. При закрытии листа дочерняя таблица в главном окне должна быть обновлена ​​новой строкой. Проблема: ничего не появляется.

Проверяя содержимое базы данных с помощью стороннего приложения, я вижу, что новые данные есть, но они не отображаются в табличном представлении, поскольку не было сохранено никакой информации об отношениях с родителем, поэтому он не знает, к какому родителю это относится.

В моем коде отсутствует информация об этом, но я просто не понимаю, как мне это запрограммировать. Другими словами: при отклонении листа укажите, какой родитель выбран, и укажите эту информацию об отношениях при вставке новых данных в дочерний элемент. Буду признателен за любую помощь.

Вот мой код:

  // there are 3 entities: Collectors (parent), CollectedItems (child) and Items.

  // we call the sheet presenting the Items list to pick from
  - (IBAction)showAddItemDialog:(id)sender {
    [NSApp beginSheet:addItemDialog
modalForWindow:window
modalDelegate:self
    didEndSelector:@selector(didEndAddItemSheet:returnCode:contextInfo:)
    contextInfo:nil];
  }

  // we dismiss the sheet by clicking on Cancel or Add
  - (IBAction)dismissAddItemDialog:(id)sender {
[NSApp endSheet:addItemDialog returnCode:([sender tag])];
    [addItemDialog orderOut:sender];
  }

  // depending on clicked button, do nothing or pass selected data
  - (void)didEndAddItemSheet:(NSWindow *)sheet returnCode:(int)returnCode contextInfo (void *)contextInfo {
    if (returnCode == 0) {
    // do nothing, this is the effect of clicking on Cancel
    }
    if (returnCode == 1) {
    NSString *theName = [[[itemsPickerController selectedObjects] valueForKey:@"itemName"] objectAtIndex:0];
    // above, we get the value from the itemName attribute sleected in the Items list
    NSLog (@"%@", theName);
    // the variable is displayed in the console, so it was correctly selected
    [self addNewItemWithName:theName];
    }
  }

  // we use the passed data to create new object (row) in the CollectedItems entity
  - (id)addNewItemWithName:(NSString *)theName {
    NSEntityDescription *newContent = [NSEntityDescription insertNewObjectForEntityForName:@"CollectedItems" inManagedObjectContext:[self managedObjectContext]];
    [newContent setValue:theName forKey:@"collectedItemName"];
    // above, we insert a new row in CollectedItems, assigning the value theName to the attribute collectedItemName
    return nil;
  }

Ответы [ 2 ]

1 голос
/ 24 января 2012

Вам необходимо добавить отношение между созданным вами CollectedItems объектом и его родительским объектом Collectors.Collectors будет содержать метод утилиты базовых данных (если вы сгенерировали классы управляемых объектов базовых данных).Это будет называться что-то вроде addCollectedItemsObject.

Перезагрузка tableViews должна затем обновиться с правильными данными - поскольку теперь она знает отношение.

Еще лучше было бы использовать NSFetchedResultsController для управления данными в ваших таблицах, чтобы при обновленииМодель данных, таблицы будут автоматически отражать изменения.

0 голосов
/ 06 февраля 2012

И для записи, для тех, кому это может помочь, вот окончательный рабочий код:

Обеспечение того, чтобы метод был сгенерирован в соответствующем файле класса Collectors для (классы управляемых объектов основных данных).

// header file
@class Collecteditems;
@interface Collectors : NSManagedObject { }
@property (nonatomic, retain) NSSet* content;
@end
@interface Collectors (CoreDataGeneratedAccessors)
- (void)addContentObject:(Collecteditems *)value;
@end

// implementation file
#import "Collectors.h"
#import "Collecteditems.h"
@implementation Collectors 
@dynamic content;
- (void)addContentObject:(Collecteditems *)value {
NSSet *s = [NSSet setWithObject:value];
[self willChangeValueForKey:@"collecteditems" withSetMutation:NSKeyValueUnionSetMutation usingObjects:s];
[[self primitiveValueForKey:@"collecteditems"] addObject:value];
[self didChangeValueForKey:@"collecteditems" withSetMutation:NSKeyValueMinusSetMutation usingObjects:s];
}

Затем добавление метода addObject в NSArrayController, управляющего таблицей собранных элементов (см. Id в исходном сообщении для справки).

- (id)addNewItemWithName:(NSString *)theName {
    NSEntityDescription *newContent = [NSEntityDescription insertNewObjectForEntityForName:@"CollectedItems" inManagedObjectContext:[self managedObjectContext]];
    [newContent setValue:theName forKey:@"collectedItemName"];
    [collectedItemsController addObject:newContent]; // line added
    return nil;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...