我在作为父/子关系中的子节点的实体中插入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;
}
答案 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;
}