Core Data 添加对象对多关系
Posted
技术标签:
【中文标题】Core Data 添加对象对多关系【英文标题】:Core Data add object to-many relationship 【发布时间】:2015-02-09 13:18:53 【问题描述】:我正在尝试使用两个实体 - WardrobeList 和 Items 来实现 Core Data 的多对多关系。 WardrobeList 具有一对多关系“items”,因此可以将多个项目添加到衣柜。
我已经创建了 NSManagedObject 子类。以下是它们的外观。
WardrobeList.h
@class Item;
@interface WardrobeList : NSManagedObject
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) BabyDetails *babydetails;
@property (nonatomic, retain) NSSet *items;
@end
@interface WardrobeList (CoreDataGeneratedAccessors)
- (void)addItemObject:(Item *)value;
- (void)removeItemObject:(Item *)value;
- (void)addItem:(NSSet *)values;
- (void)removeItem:(NSSet *)values;
@end
项目.h
@class WardrobeList;
@interface Item : NSManagedObject
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSString * brand;
@property (nonatomic, retain) NSString * color;
@property (nonatomic, retain) NSString * age;
@property (nonatomic, retain) NSDate * buydate;
@property (nonatomic, retain) NSNumber * quantity;
@property (nonatomic, retain) NSNumber * price;
@property (nonatomic, retain) NSData * image;
@property (nonatomic, retain) NSString * desc;
@property (nonatomic, retain) NSString * giftby;
@property (nonatomic, retain) NSString * category;
@property (nonatomic, retain) NSString * product;
@property (nonatomic, retain) WardrobeList *wardrobe;
@end
我有一个名为 WardrobeList 的表格视图控制器,用于显示衣柜列表。我在这里有一个添加按钮,它将我带到添加项目视图控制器,用户在其中填充项目的详细信息。
我通过 segue 传递选定的衣柜对象。这是代码。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([[segue identifier] isEqualToString:@"AddItem"])
//Assign managed objects to dest view controller
AddItemViewController *destViewController = segue.destinationViewController;
destViewController.wardrobe = wardrobe;
else if ([[segue identifier] isEqualToString:@"ShowItems"])
ItemsList *destViewController = segue.destinationViewController;
destViewController.wardrobe = wardrobe;
在 AddItemVC.m 中,我捕获用户输入的所有详细信息并将它们添加到新的项目托管对象中。然后我尝试在我的保存按钮方法中将这个 Item 对象添加到我从 segue 收到的衣柜中。
- (IBAction)save:(id)sender
NSManagedObjectContext *context = [self managedObjectContext];
// Create a new item object
Item *newItem = [NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:context];
if (!product)
newItem.category = category;
product = [products objectAtIndex:[self.pickerView selectedRowInComponent:1]];
newItem.product = product;
//Saving the text fields
newItem.name = self.itemTextField.text;
newItem.brand = self.brandTextField.text;
newItem.age = self.ageTextField.text;
newItem.color = self.colorTextField.text;
newItem.quantity = @([self.quantityTextField.text intValue]);
newItem.price = @([self.priceTextField.text floatValue]);
//Save date
newItem.buydate = self.datePicker.date;
//Save image
newItem.image = imageData;
//Save description
newItem.desc = self.descTextField.text;
//Save the gift field values
if (self.giftTextField.text)
newItem.giftby = self.giftTextField.text;
//Manage the relation between wardrobe and item
*[self.wardrobe addItemObject:newItem];*
newItem.wardrobe = self.wardrobe;
NSLog(@"Item saved");
NSError *error = nil;
// Save the object to persistent store
if (![context save:&error])
NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
[self dismissViewControllerAnimated:YES completion:nil];
我在执行保存方法时收到此错误消息。
[WardrobeList addItemObject:]: unrecognized selector sent to instance 0x788d2880
有人可以指导我在这里做错了什么以及如何纠正吗?
最终,一旦用户在 WardrobeList 中选择了一个特定的衣柜,我想在一个新的表格视图中显示所选衣柜中的所有物品。
您的帮助将不胜感激。谢谢。
【问题讨论】:
【参考方案1】:您的CoreDataGeneratedAccessors
是自动生成的还是输入的?如果我有关系,即
@property (nonatomic, retain) NSSet *rooms;
我的代码是使用项目名称而不是实体名称生成的
- (void)addRoomsObject:(Room *)value;
(识别房间中的 s)。如果不是这样,请查看您的模型(两个实体之间的正确连接,模型和类中的相同命名)或查看是否有更多错误信息
【讨论】:
我的 CoreDataGeneratedAccessors 是在生成子类后添加多对多关系时输入的。我将使用附加的 's' 更新我的子类并尝试再次运行它。我会及时通知你的,谢谢! 将“s”添加到我的 CoreDataGeneratedAccessors 后,我能够保存该项目。没有意识到这种微不足道的事情可能会导致问题。感谢您的帮助!以上是关于Core Data 添加对象对多关系的主要内容,如果未能解决你的问题,请参考以下文章