将数据从工作表传递给父/子关系中的insertNewObject

时间:2012-01-24 15:03:27

标签: objective-c cocoa core-data insertion

我在作为父/子关系中的子节点的实体中插入NewObject有问题。它是一个具有本地SQLite基础的CoreData应用程序。在主窗口上有2个实体显示2个TableView。使用contentSet,子项的表将仅显示与所选父项相关的数据。

通过显示包含来自第3个实体的项目表的工作表来向子项添加数据。用户必须从此表中选择,然后单击“添加”。在解除工作表时,应使用新行更新主窗口上的子表。问题:什么都没有出现。

使用第三方应用程序检查数据库内容,我看到新数据存在,但它没有出现在表格视图中,因为没有存储与父级关系的信息,所以它没有&#39 ;知道它与哪个家长有关。

我的代码缺少有关此内容的信息,但我不知道应该如何编程。换句话说:在解除工作表时,确定选择了哪个父项,并在子项中插入新数据时指定此关系信息。我将不胜感激任何帮助。

这是我的代码:

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

答案 0 :(得分:1)

您需要添加您创建的CollectedItems对象与其Collectors对象的父对象之间的关系。 Collectors将有一个核心数据实用程序方法(如果您已生成核心数据管理对象类)。它将被称为addCollectedItemsObject之类的东西。

然后重新加载tableViews应该使用正确的数据进行更新 - 因为它现在知道了这种关系。

更好的方法是使用NSFetchedResultsController来控制表中的数据,这样当您更新数据模型时,表将自动反映更改。

答案 1 :(得分:0)

为了记录,对于那些可能有帮助的人,这是最终的工作代码:

确保在相应的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];
}

然后在控制收集的项目表的NSArrayController上添加addObject方法(参见原始帖子中的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;
  }